锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
鎴戠殑寤鴻鏄涔?fàn)C++灝變笉瑕佺敤VC6浜嗭紝鍙互鐢╒C2005/2008.
濡傛灉浣犳兂鐢ㄤ竴涓交閲忕駭鐨勭幆澧冨涔?fàn)C++錛孧inGW Studio錛?
wxDev-Cpp , CodeBlocks , CodeLite 閮芥槸涓嶉敊鐨勯夋嫨.
]]>
鍦ㄨ皟璇曟ā寮忎笅鐨?quot;鑷姩紿楀彛"(浣嶄簬IDE涓嬫柟).
瑙傚療memset 鍓嶅悗"man -> strName -> _Bx -> _Ptr"鐨勫肩殑鍙樺寲
_Ptr 瀹為檯涓婂氨鏄痵td::string鍐呴儴鐢ㄤ簬瀛樺偍瀛楃涓茬殑鍫嗗唴瀛樼紦鍐插尯鐨勫湴鍧,涔熺浉褰撲簬鎴戜笂闈㈡彁鍒扮殑 m_pCharBuffer
]]>
鎴戠殑嫻嬭瘯緇撴灉鏄細(xì)
before memset: char buffer address( heap address ) to store string = 0000000 ,
size = 0 , capacity = 0
after memset: char buffer address( heap address ) to store string = 00000000 ,
size = 0 , capacity = 0
榪欓噷娌℃硶璐村浘錛屾垜鐨凲Q鏄?70083015錛屾瘮榪欓噷璁ㄨ蹇竴鐐?
鎴戠敤鐨刅C6 鎴戞兂榪欐槸鎴戠殑鍐呭瓨娌℃湁澧為暱鐨勫師鍥犲惂銆?
]]>
鏃㈢劧浣犱篃鍙戠幇浜嗗唴瀛樻硠婕忕殑鎯呭喌錛岄偅涔堜綘鍐嶇敤涓嬮潰鐨勬祴璇曚唬鐮佽繍琛屼竴涓?
#include "Windows.h"
#include <string>
#include <cstring>
#include <cstdlib>
using namespace std;
typedef unsigned int UINT32;
typedef unsigned short UINT16;
typedef struct structMan
{
UINT32 sexType; //ENUM_SEXY_TYPE
UINT16 usAge;
string strName;
string strAddress;
bool operator < (const structMan &man) const
{
return usAge < man.usAge;
}
bool operator > (const structMan &man) const
{
return usAge > man.usAge;
}
}MAN;
int main( int argc , char *argv[] )
{
while( true )
{
MAN man;
fprintf( stdout , "before memset: char buffer address( heap address ) to store string = %p , size = %lu , capacity = %lu\n" , \
*reinterpret_cast< const int* >( man.strName.c_str() ) , \
man.strName.size() , man.strName.capacity() );
memset( &man , 0 , sizeof( MAN ) );
fprintf( stdout , "after memset: char buffer address( heap address ) to store string = %p , size = %lu , capacity = %lu\n\n\n" , \
*reinterpret_cast< const int* >( man.strName.c_str() ) , \
man.strName.size() , man.strName.capacity() );
man.strAddress = "abcdef";
man.strName = "abc";
Sleep( 1000 ); //榪欓噷sleep鏄負(fù)浜嗚澶у鏈夋椂闂村湪浠誨姟綆$悊鍣ㄤ腑鐪嬪埌鍐呭瓨澧為暱鐨勮繃紼嬶紝涓嶈嚦浜庝竴涓嬪瓙鑰楀敖鍐呭瓨.
}
return 0;
}
鎴戦夊彇鎴戣繖閲岀殑涓涓驚鐜腑鐨勮緭鍑猴紝濡備笅:
before memset: char buffer address( heap address ) to store string = 00636200 ,
size = 0 , capacity = 15
after memset: char buffer address( heap address ) to store string = 00000000 ,
size = 0 , capacity = 0
涓嬮潰鎶婁笂榪頒唬鐮佽繘琛岀畝鍖栦究浜庡垎鏋?
while( true )
{
MAN man; //榪欓噷浼?xì)鋴社敤man鐢辯紪璇戝櫒鑷姩鐢熸垚緙虹渷鏋勯犲嚱鏁版潵璋冪敤strName鐨勭己鐪佹瀯閫犲嚱鏁板strName榪涜鏋勯?
memset( &man , 0 , sizeof( MAN ) );
涓婇潰鐨刴emset鎿嶄綔浼?xì)鎶?&man 榪欎釜鍦板潃寮濮嬬殑 sizeof( MAN )瀛楄妭鐨勫唴瀛樼┖闂村叏閮ㄦ竻闆?
榪欎篃灝辨剰鍛崇潃 man 瀵硅薄鍐呴儴鐨勬瘡涓垚鍛樺瓙瀵硅薄鎵鍗犳嵁鐨勫唴瀛橀兘琚竻闆?
man 瀵硅薄鍐呴儴涓涓?std::string , 鑰宻td::string 鍐呴儴鍖呭惈涓涓猻td::string鐢ㄤ簬瀹為檯瀛樺偍瀛楃涓茬殑鎸囧悜鍔ㄦ佸垎閰嶇殑鍫嗗唴瀛樼殑鎸囬拡錛?
鎴戜滑鍋囪榪欎釜鎸囬拡鐨勫悕縐頒負(fù) m_pCharBuffer;
鍦╯td::string鐨勬瀽鏋勫嚱鏁頒腑閲婃斁榪欎釜鍔ㄦ佸垎閰嶇殑鍫嗗唴瀛樼殑鏃跺欓渶瑕佷嬌鐢ㄨ繖涓猰_pCharBuffer錛屼篃鍗蟲槸璋冪敤 delete[] m_pCharBuffer;
濡傛灉鎴戝啓鍑轟笅鍦ㄧ殑浠g爜:
char *m_pCharBuffer = new char[ BUFFER_SIZE ]; 榪欎竴涓搷浣滃嵆鏄痵trName鐨勭己灝戞瀯閫犲嚱鏁扮殑鎿嶄綔錛屽彧涓嶈繃 BUFFER_SIZE = 15 + 1(鏈鍚庢湁涓涓?\0');
m_pCharBuffer = NULL; //榪欎竴涓搷浣滀笌涓婅堪鐨?memset 瀵?man.strName涓敤浜庢寚鍚戝姩鎬佸唴瀛樼殑鎸囬拡鎵浜х敓鐨勪綔鐢ㄧ浉鍚?灝嗘寚閽堟墍鎸囧悜鐨勫爢鍐呭瓨鍦板潃娓呴浂.
delete[] m_pCharBuffer; //姝ゆ椂 m_pCharBuffer 涓篘ULL 錛?涓嶈繃鍦–++涓紝 delete NULL鎸囬拡鏄畨鍏ㄧ殑.涓嶈繃鍥犱負(fù) m_pCharBuffer 宸茬粡涓嶆寚鍚戜笂榪皀ew鍑烘潵鐨勫唴瀛?
//鎵浠ヨ繖閲岃繘琛?delete[] m_pCharBuffer 鏃跺凡緇忎笉鑳借繘琛岃祫婧愮殑閲婃斁浜嗭紝涔熷嵆鏄彂鐢熶簡鍐呭瓨娉勬紡.
man.strName = "abc";
涓婇潰鐨勮祴鍊兼搷浣滀腑錛屽疄闄呬笂瑕佽皟鐢? std::string::operator=( const char* );
棣栧厛錛宱perator=浼?xì)鍒ゆ柇褰撳墠鐨剆trName鐨?capacity鑳藉惁瀹圭撼涓?quot;abc"錛岀敱涓婇潰鐨刴emset涔嬪悗鎴戜滑鍙互鐪嬪嚭姝ゆ椂瀛樺偍 capacity 鍊肩殑鍙橀噺鍥犱負(fù)memset涓?錛屾墍浠?
man.strName.capacity() 杈撳嚭涓?錛岃繖涔熷氨鎰忓懗鐫榪欎釜"瀹圭Н"涓嶈兘瀹圭撼涓?涓瓧鑺傜殑"abc".
鎵浠ヨ繖鏃?operator= 瑕佹墿澶у唴閮ㄧ敤浜庡瓨鍌ㄥ瓧絎︿覆鐨勭紦鍐插尯,鎵╁厖鐨勫熀鏈師鐞嗗涓?(浠g爜榪涜綆鍖栧鐞?
std::string& operator=( const char *szString )
{
// check parameter
if( m_pCharBuffer != szString ) // 闃叉 self-assign
{
delete[] m_pCharBuffer;
m_pCharBuffer = new char[ NEW_SIZE ];
memcpy( m_pCharBuffer , szString , strlen( szString ) + 1 );
}
return *this;
}
涓婇潰鐨勬搷浣? *reinterpret_cast< const int* >( man.strName.c_str() ) 鍗蟲槸鐩稿綋浜庤幏鍙栬繖涓?m_pCharBuffer 鐨勫湴鍧.
榪欎竴鐐逛綘涓瀹氳鏄庣櫧.
鐢變笂闈㈢殑浠g爜浠ュ強(qiáng)榪愯杈撳嚭鍙互鐭ラ亾,
娉ㄦ剰: 鍦ㄨ皟鐢?strName = "abc"鏃訛紝宸茬粡榪涜浜唌emset鎿嶄綔錛屾鏃剁殑 m_pCharBuffer 宸茬粡鍥犱負(fù)涓婇潰鐨?memset鎿嶄綔鑰岃娓呴浂錛屽嵆鏄?m_pCharBuffer = NULL,
鍥犱負(fù)memset鎿嶄綔涓嶄細(xì)璋冪敤鏋愭瀯鍑芥暟 錛屾墍浠ュ疄闄呬笂鍦ㄦ竻闆朵箣鍓嶅畠鎵鎸囧悜鐨勫姩鎬佸唴瀛樺潡騫舵病鏈夎閲婃斁錛?
鍦?operator=涓紝delete[] m_pCharBuffer; 鐩稿綋浜?delete[] NULL;
榪欏氨涓嶈兘閲婃斁 m_pCharBuffer 涔嬪墠鍦ㄧ己鐪佹瀯閫犳椂鎵鎸囧悜鐨勫姩鎬佸垎閰嶇殑 15 + 1 瀛楄妭鐨勫唴瀛樹簡錛屾墍浠ュ嚭鐜頒簡鍐呭瓨娉勬紡.
}
]]>
鑳藉惁瑙i噴涓涓嬶紝涓轟粈涔堝唴瀛樹嬌鐢ㄤ細(xì)涓嶅仠澧為暱鍛紵
]]>
"鍐呭瓨浣跨敤"鏁板?
鎴戠敤VC2005鍜孷C2008閮芥祴璇曡繃錛岀粨鏋滄槸"鍐呭瓨涓嶅仠澧為暱".
榪樼敤鍝綅鍚屽榪愯榪囨垜涓婇潰鐨勬祴璇曚唬鐮侊紝鍑烘潵鍏竷涓涓嬫祴璇曠粨鏋滐紝璋㈣阿!
]]>
榪欐嫻嬭瘯浠g爜鎴戣窇浜嗕簩鍗佸垎閽燂紝鍐呭瓨涔熸病瑙佸闀垮晩~~~
鍚勪綅澶т緺閮界湅鍑烘潵鍟︼紝鎴戝緢灝戠敤C++鍐欑▼搴弤~~~
]]>
鍦ㄧ紪鐮佽繃紼嬩腑錛屾垜寰堝皯浼?xì)瀵箂truct榪涜memset鎿嶄綔錛屽彧鏄伓灝?dāng)浼?xì)瀵箂ockaddr榪涜memset鎿嶄綔;鏇翠笉浼?xì)瀵筩lass榪涜memset鎿嶄綔.
鍦ㄤ綘涓婅堪鐨勪唬鐮佷腑錛屼綘瀵筂AN榪涜memset鎿嶄綔錛屾棤闈炰篃灝辨槸鎯沖皢鍚勪釜鎴愬憳鐨勫垵鍊兼竻闆訛紝濡傛灉鍩轟簬榪欎釜鍑哄彂鐐癸紝閭h璁′竴涓瀯閫犲嚱鏁板濂?
structMan::structMan( UINT32 enumSexType = SEXY_TYPE_MAN , \
UINT16 uiAge = 0 , \
const std::string &refStrName = "" , \
const std::string &refStrAddress = "" )
:sexType( enumSexType ) , usAge( uiAge ) , \
strName( refStrName ) , strAddress( refStrAddress )
{
// check parameters here銆?
}
鍙渶瑕佸皯閲忕殑浠g爜灝變細(xì)甯︽潵澶ч噺鐨勬柟渚匡紝鑰屼笖浣犱篃灝卞啀涔熶笉鐢╩emset.
浣犱篃灝變笉闇瑕佸struct鐨勫悇涓垚鍛樹緷嬈¤祴鍊間簡錛岀洿鎺ヤ紶鍙傛瀯閫犲氨鍙互浜嗭紝榪欐牱浠g爜搴旇浼?xì)鏇翠紭闆呬竴浜?
鍙︿竴鏂歸潰錛屽 std::list 榪涜sort鎿嶄綔浠庨昏緫涓婃槸娌℃湁闂鐨勶紝浣嗘槸璁捐椋庢牸涓婃槸鏈夐棶棰樼殑:
鍥犱負(fù)std::list涓殑姣忎竴涓垚鍛樻槸鍩轟簬閾劇殑褰㈠紡榪炴帴鍦ㄤ竴璧風(fēng)殑錛屾墍浠ユ垜浠笉鑳藉鍏惰繘琛岄殢鏈鴻闂紝
濡傛灉鎴戜滑瑕佽闂畇td::list涓殑絎琋涓垚鍛橈紝閭d箞鎴戜滑闇瑕佷粠閾捐〃澶村紑濮嬪悜閾捐〃灝鵑儴渚濇榪唬N嬈?
鍦ㄨ繖縐嶆儏鍐典笅錛屽鏋滀竴涓摼琛ㄨ繃澶э紝閭d箞榪欓噷灝辨湁鏁堢巼闂.
涓鑸儏鍐典笅錛屾垜浠彧瀵?quot;綾諱技浜庢暟緇勭殑鍙互闅忔満璁塊棶"鐨剆td瀹瑰櫒榪涜鎺掑簭.
]]>
]]>