锘??xml version="1.0" encoding="utf-8" standalone="yes"?>一本色道久久综合狠狠躁篇的优点,亚洲茄子视频,国产日韩在线视频http://m.shnenglu.com/mysileng/category/20052.htmlzh-cnFri, 16 Jan 2015 15:44:01 GMTFri, 16 Jan 2015 15:44:01 GMT60C/C++ Volatile鍏抽敭璇嶆繁搴﹀墫鏋?/title><link>http://m.shnenglu.com/mysileng/archive/2015/01/13/209505.html</link><dc:creator>閼緳</dc:creator><author>閼緳</author><pubDate>Tue, 13 Jan 2015 12:35:00 GMT</pubDate><guid>http://m.shnenglu.com/mysileng/archive/2015/01/13/209505.html</guid><wfw:comment>http://m.shnenglu.com/mysileng/comments/209505.html</wfw:comment><comments>http://m.shnenglu.com/mysileng/archive/2015/01/13/209505.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/mysileng/comments/commentRss/209505.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/mysileng/services/trackbacks/209505.html</trackback:ping><description><![CDATA[     鎽樿: 1    鑳屾櫙    12    Volatile錛氭槗鍙樼殑    12.1    灝忕粨    23    Volatil...  <a href='http://m.shnenglu.com/mysileng/archive/2015/01/13/209505.html'>闃呰鍏ㄦ枃</a><img src ="http://m.shnenglu.com/mysileng/aggbug/209505.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/mysileng/" target="_blank">閼緳</a> 2015-01-13 20:35 <a href="http://m.shnenglu.com/mysileng/archive/2015/01/13/209505.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>鍑芥暟璋冪敤綰﹀畾錛歘stdcall錛宊cdecl錛宊fastcall (杞?http://m.shnenglu.com/mysileng/archive/2012/12/27/196703.html閼緳閼緳Thu, 27 Dec 2012 03:41:00 GMThttp://m.shnenglu.com/mysileng/archive/2012/12/27/196703.htmlhttp://m.shnenglu.com/mysileng/comments/196703.htmlhttp://m.shnenglu.com/mysileng/archive/2012/12/27/196703.html#Feedback0http://m.shnenglu.com/mysileng/comments/commentRss/196703.htmlhttp://m.shnenglu.com/mysileng/services/trackbacks/196703.html(1) _stdcall璋冪敤
銆銆_stdcall 鏄疭tandard Call鐨勭緝鍐欙紝鏄疌++鐨勬爣鍑嗚皟鐢ㄦ柟寮忥紝涔熸槸Pascal紼嬪簭鐨勭己鐪佽皟鐢ㄦ柟寮忥紝鍙傛暟閲囩敤浠庡彸鍒板乏鐨勫帇鏍堟柟寮忥紝濡傛灉鏄皟鐢ㄧ被鎴愬憳鐨勮瘽錛屾渶鍚庝竴涓叆鏍堢殑鏄痶his鎸囬拡銆傝繖浜涘爢鏍堜腑鐨勫弬鏁扮敱琚皟鍑芥暟鑷韓鍦ㄨ繑鍥炲墠娓呯┖錛?/div>
浣跨敤鐨勬寚浠ゆ槸 retn X錛孹琛ㄧず鍙傛暟鍗犵敤鐨勫瓧鑺傛暟錛孋PU鍦╮et涔嬪悗鑷姩寮瑰嚭X涓瓧鑺傜殑鍫嗘爤絀洪棿銆傜О涓鴻嚜鍔ㄦ竻鏍堛?/div>
銆銆WIN32 Api閮介噰鐢╛stdcall璋冪敤鏂瑰紡錛岃繖鏍風(fēng)殑瀹忓畾涔夎鏄庝簡闂錛?/div>
銆銆#define WINAPI _stdcall
銆銆鎸塁緙栬瘧鏂瑰紡錛宊stdcall璋冪敤綰﹀畾鍦ㄨ緭鍑哄嚱鏁板悕鍓嶉潰鍔犱笅鍒掔嚎錛屽悗闈㈠姞“@”絎﹀彿鍜屽弬鏁扮殑瀛楄妭鏁幫紝褰㈠_functionname@number銆?/div>
(2) _cdecl璋冪敤
銆銆_cdecl鏄疌 Declaration[澹版槑]鐨勭緝鍐欙紝琛ㄧずC/C++璇█榛樿鐨勫嚱鏁拌皟鐢ㄦ柟娉曪紝涔熸槸C/C++鐨勭己鐪佽皟鐢ㄦ柟寮忥紝鎵鏈夊弬鏁?span style="color: red;">浠庡彸鍒板乏渚濇鍏ユ爤錛岃繖浜涘弬鏁扮敱璋冪敤鑰呮竻闄?/span>錛岀О涓烘墜鍔ㄦ竻鏍堛俖cedcl綰﹀畾鐨勫嚱鏁板彧鑳借C/C++璋冪敤錛屾瘡涓涓皟鐢ㄥ畠鐨?/div>
鍑芥暟閮藉寘鍚竻絀哄爢鏍堢殑浠g爜錛屾墍浠ヤ駭鐢熺殑鍙墽琛屾枃浠跺ぇ灝忎細(xì)姣旇皟鐢╛stdcall鍑芥暟鐨勫ぇ銆傝璋冪敤鍑芥暟鏃犻渶瑕佹眰璋冪敤鑰呬紶閫掑灝戝弬鏁幫紝璋冪敤鑰呬紶閫掕繃澶氭垨鑰呰繃灝戠殑鍙傛暟錛岀敋鑷沖畬鍏ㄤ笉鍚岀殑鍙傛暟閮戒笉浼?xì)漶旂敓缂栬瘧闃秾D電殑閿欒銆?/div>
銆銆鐢變簬_cdecl璋冪敤鏂瑰紡鐨勫弬鏁板唴瀛樻爤鐢辮皟鐢ㄨ呯淮鎶わ紝鎵浠ュ彉闀垮弬鏁扮殑鍑芥暟鑳斤紙涔熷彧鑳斤級(jí)浣跨敤榪欑璋冪敤綰﹀畾銆?/div>
銆銆鐢變簬Visual C++榛樿閲囩敤_cdecl 璋冪敤鏂瑰紡錛屾墍浠C涓腑璋冪敤DLL鏃訛紝鐢ㄦ埛搴斾嬌鐢╛stdcall璋冪敤綰﹀畾銆?/div>
銆銆鎸塁緙栬瘧鏂瑰紡錛宊cdecl璋冪敤綰﹀畾浠呭湪杈撳嚭鍑芥暟鍚嶅墠闈㈠姞涓嬪垝綰匡紝褰㈠_functionname銆?/div>
(3) _fastcall璋冪敤
銆銆_fastcall 鏄紪璇戝櫒鎸囧畾鐨勫揩閫熻皟鐢ㄦ柟寮忋傜敱浜庡ぇ澶氭暟鐨勫嚱鏁板弬鏁頒釜鏁板緢灝戯紝浣跨敤鍫嗘爤浼犻掓瘮杈冭垂鏃躲傚洜姝fastcall閫氬父瑙勫畾灝嗗墠涓や釜錛堟垨鑻ュ共涓級(jí)鍙傛暟鐢卞瘎瀛樺櫒浼犻掞紝鍏朵綑鍙傛暟榪樻槸閫氳繃鍫嗘爤浼犻掋備笉鍚岀紪璇戝櫒緙栬瘧鐨勭▼搴忚瀹氱殑瀵?/div>
瀛樺櫒涓嶅悓銆傝繑鍥炴柟寮忓拰_stdcall鐩稿綋銆?/div>
銆銆_fastcall璋冪敤杈冨揩錛屽畠閫氳繃CPU鍐呴儴瀵勫瓨鍣ㄤ紶閫掑弬鏁般?/div>
 
(4)PASCAL璋冪敤
PASCAL 鏄疨ascal璇█鐨勫嚱鏁拌皟鐢ㄦ柟寮忥紝涔熷彲浠ュ湪C/C++涓嬌鐢紝鍙傛暟鍘嬫爤欏哄簭涓巁cdecl鍜宊stdcall鐩稿弽銆?/div>
 
褰掔撼濡備笅:
璋冪敤綰﹀畾            鍏ユ爤鍙傛暟娓呯悊         鍙傛暟鍏ユ爤欏哄簭
-----------        --------------         ----------------
cdecl               璋冪敤鑰呭鐞?           鍙?>宸?/div>
stdcall             鍑芥暟鑷繁澶勭悊        鍙?>宸?/div>
fastcall            鍑芥暟鑷繁澶勭悊        渚濊禆浜庣紪璇戝櫒
pascal             鍑芥暟鑷繁澶勭悊        宸?>鍙?/div>


閼緳 2012-12-27 11:41 鍙戣〃璇勮
]]>宸﹀煎拰鍙沖鹼紙杞級(jí)http://m.shnenglu.com/mysileng/archive/2012/12/16/196350.html閼緳閼緳Sun, 16 Dec 2012 07:08:00 GMThttp://m.shnenglu.com/mysileng/archive/2012/12/16/196350.htmlhttp://m.shnenglu.com/mysileng/comments/196350.htmlhttp://m.shnenglu.com/mysileng/archive/2012/12/16/196350.html#Feedback0http://m.shnenglu.com/mysileng/comments/commentRss/196350.htmlhttp://m.shnenglu.com/mysileng/services/trackbacks/196350.html

宸﹀煎彸鍊?/span>

宸﹀鹼紙lvalue錛夊拰鍙沖鹼紙rvalue錛夋槸緙栫▼涓袱涓潪甯稿熀鏈殑姒傚康錛屼絾鏄篃闈炲父瀹規(guī)槗璁╀漢璇В錛岀湅浜嗗緢澶氭枃绔狅紝鑷垜鎰熻鐪熸灝嗚繖涓棶棰樿鐨勫緢閫忓交鐨勬枃绔犺繕娌℃湁鐪嬭錛屾墍浠ヨ嚜鍛婂鍕囨潵灝濊瘯涓涓嬨傚鏋滃乏鍊煎彸鍊肩殑姒傚康涓嶆槸闈炲父娓呮鐨勮瘽錛屽畠浠繜鏃╀細(xì)鍍忔嫤璺檸涓鏍瘋煩鍑烘潵錛岃浣犵儲(chǔ)蹇冧笉宸詫紝灝卞儚鐜╃數(shù)鑴戞父鎴忕殑鏃跺欐瘡闅斾竴孌墊椂闂存繪湁閭d箞鍑犱釜鍦伴浄鑰冮獙浣犵殑鑰愭э紝濡傛灉涓嬈℃妸鎵鏈夊湴闆鋒壂灝藉氨濂戒簡銆傦細(xì)錛?/span>

宸﹀鹼紙lvalue錛夊拰鍙沖鹼紙rvalue錛夋渶鍏堟潵婧愪簬緙栬瘧鐞嗚錛堟劅璋㈠崡澶у皬鐧懼悎鐨刾rograms錛夈傚湪C璇█涓〃紺轟綅浜庤祴鍊艱繍綆楃涓や晶鐨勪袱涓鹼紝宸﹁竟鐨勫氨鍙乏鍊鹼紝鍙寵竟鐨勫氨鍙彸鍊箋傛瘮濡傦細(xì)

int ii = 5;//ii鏄乏鍊鹼紝5鏄彸鍊?/span>

int jj = ii;//jj鏄乏鍊鹼紝ii鏄彸鍊?/span>

涓婇潰琛ㄦ槑錛屽乏鍊艱偗瀹氬彲浠ヤ綔涓哄彸鍊間嬌鐢紝浣嗗弽涔嬪垯涓嶇劧銆傚乏鍊煎拰鍙沖肩殑鏈鏃╁尯鍒氨鍦ㄤ簬鑳藉惁鏀瑰彉銆傚乏鍊兼槸鍙互鍙樼殑錛屽彸鍊間笉鑳藉彉銆傘愭敞1銆?/span>

娉?/span>1錛氳繖涓鐐瑰湪C++涓凡緇?/span>鐚緤鍙樿壊錛屼笉鍐嶆垚绔嬨傛嫳鐚父鎴忚繕鏄尯濂界帺鐨勶紝鎴戣繕鐪熸姄榪囧ソ鍑犳鍏ㄧ孩蹇冿紝涓嶈繃鐪熺殑濂介櫓銆傦細(xì)錛?/span>

鍦ㄥ緢澶氭枃绔犱腑鎻愬埌錛屽湪C++涓紝宸﹀兼洿澶氱殑鎸囩殑鏄彲浠ュ畾浣嶏紝鍗蟲湁鍦板潃鐨勫鹼紝鑰屽彸鍊兼病鏈夊湴鍧銆傘愭敞2銆?/span>

娉?/span>2錛氳繖涓鐐逛粛鐒朵笉鍑嗙‘錛屾垜鍦ㄧ▼搴忎腑鐢熸垚涓涓復(fù)鏃跺彸鍊?/span>std::vector()錛屼綘鑳藉璇村畠娌℃湁鍦板潃鍚楋紵闅鵑亾瀹冩槸娌℃湁鑲変綋鐨勯欖傛垨騫界伒錛熷畠鏄湁鍦板潃鐨勶紝鑰屼笖瀹冧篃鏄粷瀵圭殑鍙沖箋?/span>

鍦ㄧ幇浠?/span>C++涓紝鐜板湪宸﹀煎拰鍙沖煎熀鏈笂宸茬粡澶卞幓瀹冧滑鍘熸湰鎵鍏鋒湁鐨勬剰涔夛紝瀵逛簬宸﹀艱〃杈懼紡錛岄氳繃鍏蜂綋鍚嶅瓧鍜屽紩鐢紙pointer or reference錛夋潵鎸囧畾涓涓璞°傞潪宸﹀煎氨鏄彸鍊箋傛垜鏉ヤ笅涓涓畾涔夛細(xì)

宸﹀艱〃紺虹▼搴忎腑蹇呴』鏈変竴涓壒瀹氱殑鍚嶅瓧寮曠敤鍒拌繖涓箋?/span>

鍙沖艱〃紺虹▼搴忎腑娌℃湁涓涓壒瀹氱殑鍚嶅瓧寮曠敤鍒拌繖涓箋?/span>

璺熷畠浠槸鍚﹀彲浠ユ敼鍙橈紝鏄惁鍦ㄦ爤鎴栧爢錛?/span>stack or heap錛変腑鏈夊湴鍧姣棤鍏崇郴銆?/span>

1錛庡乏鍊?/span>

鍦ㄤ笅闈㈢殑浠g爜涓細(xì)

int ii = 5;

int const jj = ii;

int a[5];

a[0] = 100;

*(a+3) = 200;

int const& max( int const& a, int const& b ) //call by reference

{

      return a > b ? a : b;

}

int& fun(int& a) //call by reference

{

      a += 5;

   return a;

}

ii錛?/span>jj錛?/span>a[0]錛?/span>*(a+3)錛岃繕鏈夊嚱鏁?/span>max鐨勮繑鍥炲兼瘮濡?/span>max(ii, jj)錛屻愭敞3銆戝嚱鏁?/span>fun鐨勮繑鍥炲?/span>fun(ii)閮芥槸宸﹀箋傦紝瀹冧滑閮芥槸鏈夌壒瀹氱殑寮曠敤鍚嶅瓧鐨勫箋?/span>ii錛?/span>jj錛?/span>a[0]錛?/span>*(a+3)錛?/span>max(ii, jj)錛?/span>fun(ii)鍒嗗埆灝辨槸瀹冧滑鐨勫悕瀛椼?/span>

娉?/span>3錛氬湪榪欓噷鏈変竴涓笉澶鏄撳垎娓呮鐨勭洸鐐廣傞偅灝辨槸鏈変漢浼?xì)闂?/span>max(8, 9)鍒拌揪鏄乏鍊艱繕鏄彸鍊鹼紝C++鏍囧噯瑙勫畾甯擱噺寮曠敤錛?/span>reference to const錛夊彲浠ュ紩鐢ㄥ埌鍙沖鹼紝鎵浠?/span>max(8, 9)浼間箮搴旇鏄彸鍊鹼紝涓嶈繃涓嶇瀹冩槸宸﹀鹼紝榪樻槸鍙沖鹼紝鎴戜滑閮戒笉鑳借瘯鍥懼幓鏀瑰彉瀹冦備負(fù)浜嗕笌鍓嶉潰鐨勬蹇典竴鑷達(dá)紝鎴戣涓哄畠鏄乏鍊鹼紝涓嶅彲鏀瑰彉鐨勫父閲忓乏鍊箋?/span>

宸﹀兼湁涓嶈兘鏀瑰彉鐨勶紝鍗寵const鎵淇グ鐨勫乏鍊鹼紝姣斿涓婇潰鐨?/span>jj錛?/span>max(ii, jj)閮芥槸琚父閲忥紙const錛夐瓟鍜掓墍鍥頒綇鐨勫乏鍊箋?/span>

娌℃湁琚?/span>const鍥頒綇鐨勫乏鍊煎綋鐒舵槸鍙互鏀瑰彉鐨勶紝姣斿涓嬮潰鐨勪唬鐮侀兘鏄垚绔嬬殑錛?/span>

ii = 600;

a[0] = 700;

fun(ii) = 800; //OK!

鎴戜滑鐨勭溂鐫涙病鏈夐棶棰橈紝fun(ii) = 800;瀹屽叏姝g‘錛屽洜涓哄畠鏄彲浠ユ敼鍙樼殑宸﹀箋?/span>鎵浠ユ垜浠湅STL鐨勬簮鐮侊紝灝變細(xì)鐞嗚Вstd::vector涓殑閲嶈澆operator[]榪愮畻絎︾殑榪斿洖鍊間負(fù)浠涔堣鍐欐垚寮曠敤錛屽洜涓?/span>operator[]蹇呴』榪斿洖宸﹀箋?/span>

 

2錛庡彸鍊?/span>

娌℃湁鐗瑰畾鍚嶅瓧鐨勫兼槸鍙沖箋傚厛鐪嬩笅闈㈢殑浠g爜錛?/span>

std::list();

std::string(“It is a rvalue!”);

int fun1() //call by value

{

      

}

int* fun2() //call by reference

{

      

}

鍏朵腑std::list()錛?/span>std::string(“It is a rvalue!”)錛屽嚱鏁?/span>fun1鐨勮繑鍥炲?/span>fun1()錛屽嚱鏁?/span>fun2鐨勮繑鍥炲?/span>fun2()閮芥槸鍙沖鹼紝瀹冧滑鐨勫奸兘娌℃湁鐗瑰畾鐨勫悕瀛楀幓寮曠敤銆備篃璁告湁浜轟細(xì)濂囨紝fun2()涔熸槸鍙沖鹼紵鏈鍓嶉潰鐨?/span>max(a,b)涓嶆槸宸﹀煎悧錛?/span>

璇風(fēng)湅娓呮錛屽嚱鏁?/span>fun2鐨勮繑鍥炲兼槸pointer錛?/span>pointer涔熸槸call by value錛岃屽嚱鏁?/span>max鐨勮繑鍥炲兼槸reference錛?/span>reference鏄?/span>call by reference銆傛墍浠ヨC++涓紩鍏?/span>reference涓嶄粎浠呮槸涓轟簡鏂逛究錛屽畠涔熸槸涓縐嶅繀欏匯傘愭敞4銆?/span>

娉?/span>4錛?/span>Scott Meyer鍐欑殑銆?/span>More Effective C++銆嬬殑鏉℃1涓撻棬璁蹭簡pointer鍜?/span>reference鐨勫尯鍒紝鍐欑殑寰堝ソ錛岃鯨鍒殑闈炲父娓呮銆?/span>

fun2()鏄彸鍊鹼紝浣?/span> *fun2()鍗存槸宸﹀鹼紝灝辮窡緇忓父鐪嬪埌鐨?/span>*p涓鏍鳳紝鎵浠ョ湅C++搴撲唬鐮佺殑鏃跺欙紝浼?xì)鍙戠幇閲嶈?/span>operator*鐨勫嚱鏁拌繑鍥炲兼槸reference銆?/span>

褰撶劧鎴戣繕閬楁紡浜嗕竴縐嶅彸鍊鹼紝閭e氨鏄瓧闈笂鐨勶紙literal錛夊鹼紝姣斿5錛?/span>8.23錛?/span>’a’絳夌瓑鐞嗘墍褰撶劧鐨勯兘鏄彸鍊箋?/span>

鍙沖兼渶鍒濆嚭鐜扮殑鏃跺欙紝涓涓渶澶х殑鐗瑰緛灝辨槸涓嶅彲鏀瑰彉銆備絾灝辮窡鎴戜滑鐨勯亾寰鋒爣鍑嗕竴鏍鳳紝鏃朵唬涓嶅悓浜嗭紝鏍囧噯涔熷彉鍖栦簡錛屼互鍓嶇殑涓夌翰浜斿父鏃╁凡緇忚鎵斿埌鍘嗗彶鐨勫瀮鍦懼爢閲岄潰浜嗐?/span>

C++涓湁鍙互鏀瑰彉鐨勫彸鍊鹼紝鑰屼笖榪欎釜鐗規(guī)ц繕闈炲父鏈夌敤銆傞偅灝辨槸鐢ㄦ埛鑷畾涔夌殑綾伙紙class錛夌殑鏋勯犲嚱鏁扮敓鎴愮殑涓存椂瀵硅薄銆傛瘮濡傦細(xì)

std::vector(9)錛?/span>std::deque()錛?#8230;…閮芥槸鍙互鏀瑰彉鐨勫彸鍊箋傚湪Herb Sutter鐨勩?/span>More Exceptional C++銆嬩腑鐨勬潯嬈?/span>7鐨?/span>page51欏墊湁榪欐牱鍑犺浠g爜錛?/span>

// Example 7-2(b): The right way to shrink-to-fit a vector.

vector<Customer> c( 10000 );

// ...now c.capacity() >= 10000...

// erase all but the first 10 elements

c.erase( c.begin()+10, c.end() );

// the following line does shrink c's

// internal buffer to fit (or close)

vector<Customer>( c ).swap( c );

// ...now c.capacity() == c.size(), or

// perhaps a little more than c.size()

璁ょ湡鐪嬪嚑閬嶏紝浣犱細(xì)鍙戠幇浣?/span>vector鐨勫ぇ灝忓澶у埌涓瀹氱▼搴︼紝浣犲張鐢ㄤ笉鐫榪欎箞澶氱┖闂寸殑鏃跺欙紝浣犱細(xì)鎯沖姙娉曟妸瀹冩敹緙╁埌鏈鍚堥傜殑澶у皬錛屼絾鍒╃敤鍒殑鍔炴硶姣斿璋冪敤鎴愬憳鍑芥暟reserve()閮芥棤娉曞姙鍒幫紝榪欎釜鏃跺欏氨蹇呴』鍒╃敤鍙沖煎彲浠ユ敼鍙樿繖涓ц川浜嗐?/span>

vector<Customer>( c ).swap( c );榪欒浠g爜灝辨槸鐐圭潧涔嬪銆?/span>

棣栧厛浣跨敤澶嶅埗鏋勯犲嚱鏁扮敓鎴愪復(fù)鏃跺彸鍊?/span>vector<Customer>( c )錛岃繖涓彸鍊兼濂芥槸鍚堥傚ぇ灝忥紝鐒跺悗鍜?/span>c浜ゆ崲銆愭敞5銆戯紝c灝卞彉鎴愬悎閫傚ぇ灝忎簡錛屾渶鍚庡湪鏁翠釜琛ㄨ揪寮忕粨鏉熺殑鏃跺欙紝榪欎釜涓存椂鍙沖兼瀽鏋勫綊榪樺唴瀛樼┖闂淬傜湡鏄粎澹竴鑸殑浼橀泤錛?/span>

娉?/span>5錛氳繖涓椂鍊欒繖涓復(fù)鏃跺彸鍊煎氨鍙戠敓浜嗘敼鍙樸?/span>

濡傛灉榪樹笉鐞嗚В錛屽彲浠ョ湅鐪嬩功錛屾垨鑰呯洿鎺ョ湅搴撶殑婧愪唬鐮併?/span>

鑷充簬涓轟粈涔堜細(xì)榪欐牱錛熸垜鎬濊冧簡涓涓嬶紝鎴戞兂鏄繖鏍風(fēng)殑錛屾垜浠湅綾伙紙class錛夌殑鏁版嵁甯冪疆緇撴瀯錛屼細(xì)鍙戠幇瀹冪殑姣忎竴涓暟鎹垚鍛橀兘鏄湁鍚嶅瓧鐨勶紝鎴戞兂緙栬瘧鍣ㄥ湪緙栬瘧鐨勮繃紼嬩腑錛岄兘浼?xì)鐢熸垚涓涓閮ㄤ笉鎵鐭ョ殑瀵硅繖涓復(fù)鏃跺璞″彸鍊肩殑鍚嶅瓧寮曠敤錛屼絾闇瑕佹敼鍙樿繖涓復(fù)鏃跺璞$殑鏃跺欙紝榪欎釜鍚嶅瓧灝辯敤涓婁簡銆傛瘮濡傦細(xì)

class Point

{

public: //綰補(bǔ)涓轟簡鏂逛究錛屾垜鎶婃暟鎹垚鍛樺叕寮錛岀幇瀹炰腑灝介噺涓嶈榪欐牱鐢?/span>

      int x, y ,z;

      ……//鍏朵粬鍚勭鎴愬憳鍑芥暟

};

鎴戜滑鐜板湪灝卞彲浠ユ敼鍙樺彸鍊鹼紝鐢ㄥ埌浜嗗尶鍚嶇殑寮曠敤鍚嶅瓧銆?/span>

Point().x = 6;//鏀瑰彉浜嗗彸鍊?/span>

Point().y = 6;//鍚屾剰鏀瑰彉浜嗗彸鍊鹼紝涓嶈繃娉ㄦ剰錛岃繖涓彸鍊艱窡涓婇潰鐨勪笉鏄悓涓涓?/span>

鎬葷粨

宸﹀煎拰鍙沖肩殑鐪熸鍖哄埆鎴戞兂灝辨槸榪欎簺浜嗭紝宸﹀艱〃紺烘湁鐗瑰畾鐨勫悕瀛楀紩鐢紝鑰屽彸鍊兼病鏈夌壒瀹氱殑鍚嶅瓧寮曠敤銆傚綋鐒舵垜浠嶇劧浼?xì)鏈夌枏蹇藉Q屽笇鏈涘ぇ瀹惰兘澶熸彁閱掓垜錛屾寚姝f垜鐨勪笉瓚熾?/span>

鍓嶄袱澶╃湅Herb Sutter浠庨偖浠朵腑瀵勬潵鐨勬柊鏂囩珷錛堟垜璁㈤槄浠栫殑鏂版枃绔犻偖浠墮氱煡錛夛紝涓綃囨槸璁?/span>Tuple鏁版嵁緇撴瀯鐨勶紝娌℃湁浠涔堟柊鎰忥紝浠ュ墠濂藉儚鐪嬭繃錛岃繕鏈変竴綃囧悕瀛楁槸錛氾紙Mostly錛?/span>Private,鍦板潃涓?/span>http://www.cuj.com/documents/s=8273/cujcexp2107sutter/ 鍐呭鏈韓騫朵笉娣憋紝浣嗙湅瀹屾枃绔狅紝鍙戠幇闅忓鍙C++鐨勬嘗璇′簯璋詫紝鍙堜細(xì)瀵逛粈涔堝彨琚栭噷涔懼潳錛屾淮姘磋棌嫻峰涓浠芥劅鎬ц璇嗐?/span>

鍦ㄤ笅涓綃囨枃绔犳垜鎯充粠涓嶅悓浜庝竴鑸殑瑙掑害錛屼粠鑷繁鐨勭粡鍘嗚皥璋堝湪鏍℃瘯涓氱敓鍦?/span>IT琛屼笟鎬庢牱鎵懼伐浣滐紝鎴戞兂浼?xì)璁╂墍鏈夎鑰呴兘鏈変竴浜涙濊冿紝涓嶄粎浠呮槸姹傝亴鑰呫傞鐩垜宸茬粡鎯沖ソ浜嗭紝灝卞彨銆婃壆铏庡悆鐚嬶紝涓嶈繃鐜板湪鎴戞湁涓浜涘埆鐨勪簨鎯呰蹇欙紝鎵浠ュ彲鑳戒細(xì)璁╁ぇ瀹剁瓑鍑犲ぉ銆?/span>

杞澆璇鋒敞鏄庢潵婧愶紝璋㈣阿錛?/span>

鍚存鍐欎簬2003.6.20

鏈榪戜慨鏀?/span>2003.6.21

杞嚜錛?/span> http://blog.csdn.net/csdnji/article/details/169200



閼緳 2012-12-16 15:08 鍙戣〃璇勮
]]>
鎷瘋礉鏋勯犲嚱鏁板拰璧嬪兼搷浣滃嚱鏁扮殑鍙傛暟涓轟粈涔堟槸const鍜?amp;?! http://m.shnenglu.com/mysileng/archive/2012/12/16/196349.html閼緳閼緳Sun, 16 Dec 2012 06:52:00 GMThttp://m.shnenglu.com/mysileng/archive/2012/12/16/196349.htmlhttp://m.shnenglu.com/mysileng/comments/196349.htmlhttp://m.shnenglu.com/mysileng/archive/2012/12/16/196349.html#Feedback0http://m.shnenglu.com/mysileng/comments/commentRss/196349.htmlhttp://m.shnenglu.com/mysileng/services/trackbacks/196349.html涔?fàn)鎯簡杩欐牱鍐欏Q屼絾鏈夋椂鍊欎細(xì)鍙嶉棶涓嬭嚜宸變負(fù)浠涔堣const鍜?amp;?
1.涓轟粈涔堣&?
絳旓細(xì)&鏄繀欏葷殑銆?br />濡傛灉瀹冧笉鏄紩鐢紝鍦ㄤ紶閫掑弬鏁版椂錛屼細(xì)浜х敓涓涓眬閮ㄥ彉閲忓仛鍙傛暟錛岃岃繖涓眬閮ㄥ彉閲忕殑鏋勯犲張瑕佽皟copy鏋勯犲嚱鏁頒竴嬈?....閭e氨瀛愬瓙瀛欏瓩鏃犵┓鍖簡....
浣嗗鏋滄槸寮曠敤錛屽湪浼犻掑弬鏁版椂鍊欙紝灞閮ㄥ彉閲忓彧闇瑕佺粦瀹氬師鍙橀噺錛岃屼笉闇瑕佸啀涓嬈¤皟鐢╟opy鏋勯犲嚱鏁般?br />
2.涓轟粈涔堣const?
絳旓細(xì)const涓嶆槸蹇呴』鐨勩?br />
鏋勯犲嚱鏁版槸鐢ㄥ紩鐢ㄦ柟寮忎紶閫掑鍒跺璞★紝寮曠敤鏂瑰紡浼犻掔殑鏄湴鍧錛屽洜姝ゅ湪鏋勯犲嚱鏁板唴瀵硅寮曠敤鐨勪慨鏀逛細(xì)褰卞搷婧愬璞°傝屼綘鍦ㄧ敤瀵硅薄a1鏋勯燼2鏃訛紝鑷劧涓嶅笇鏈涘鍒舵瀯閫犲嚱鏁頒細(xì)鏀瑰彉a1鐨勫唴瀹癸紝鍥犳瑕侀槻姝㈠鍒舵瀯閫犲嚱鏁板唴閮ㄤ慨鏀硅寮曠敤錛屾墍浠ヤ竴鑸敤const澹版槑銆傚姞涓嶅姞const榪樻槸闇瑕佺湅copy鏋勯犵殑琛屼負(fù)錛屾瘮濡俿td::auto_ptr鐨勬瀯閫犲嚱鏁幫紝灝辨病鏈塩onst,鍥犱負(fù)瀹冭鑾峰緱鍘熸湁瀵硅薄鎸囬拡鐨勬嫢鏈夋潈銆?/pre>

閼緳 2012-12-16 14:52 鍙戣〃璇勮
]]>C++妯℃澘鍏冪紪紼?鍏ラ棬綆浠?(杞?http://m.shnenglu.com/mysileng/archive/2012/12/01/195869.html閼緳閼緳Sat, 01 Dec 2012 12:01:00 GMThttp://m.shnenglu.com/mysileng/archive/2012/12/01/195869.htmlhttp://m.shnenglu.com/mysileng/comments/195869.htmlhttp://m.shnenglu.com/mysileng/archive/2012/12/01/195869.html#Feedback0http://m.shnenglu.com/mysileng/comments/commentRss/195869.htmlhttp://m.shnenglu.com/mysileng/services/trackbacks/195869.html

C++妯℃澘鍏冪紪紼?鍏ラ棬綆浠?/a>

鏈榪戜竴鐩村湪鐪婼TL鍜孊oost錛屾簮鐮侀噷杈瑰ソ澶氭秹鍙?qiáng)鍒版ā鏉垮厓缂柦E嬫妧鏈紝綆鍗曚簡瑙d竴涓嬶紝澶囧繕錛圔oost Python涓殑娑夊強(qiáng)妯℃澘鍏冪殑閮ㄥ垎閲嶇偣鍏蟲敞涓涓嬶級(jí)銆?/p>

鑼冧緥寮曞叆

涓昏鎬濇兂

鍒╃敤妯℃澘鐗瑰寲鏈哄埗瀹炵幇緙栬瘧鏈熸潯浠墮夋嫨緇撴瀯錛屽埄鐢ㄩ掑綊妯℃澘瀹炵幇緙栬瘧鏈熷驚鐜粨鏋勶紝妯℃澘鍏冪▼搴忓垯鐢辯紪璇戝櫒鍦ㄧ紪璇戞湡瑙i噴鎵ц銆?/p>

浼樺姡鍙?qiáng)閫傜敤鎯呭喌

閫氳繃灝嗚綆椾粠榪愯鏈熻漿縐昏嚦緙栬瘧鏈燂紝鍦ㄧ粨鏋滅▼搴忓惎鍔ㄤ箣鍓嶅仛灝藉彲鑳藉鐨勫伐浣滐紝鏈緇堣幏寰楅熷害鏇村揩鐨勭▼搴忋備篃灝辨槸璇存ā鏉垮厓緙栫▼鐨勪紭鍔垮湪浜庯細(xì)

銆銆1.浠ョ紪璇戣楁椂涓轟唬浠鋒崲鏉ュ崜瓚婄殑榪愯鏈熸ц兘錛堜竴鑸敤浜庝負(fù)鎬ц兘瑕佹眰涓ユ牸鐨勬暟鍊艱綆楁崲鍙栨洿楂樼殑鎬ц兘錛夈傞氬父鏉ヨ錛屼竴涓湁鎰忎箟鐨勭▼搴忕殑榪愯嬈℃暟錛堟垨鏈嶅焦鏃墮棿錛夋繪槸榪滆繙瓚呰繃緙栬瘧嬈℃暟錛堟垨緙栬瘧鏃墮棿錛夈?/p>

銆銆2.鎻愪緵緙栬瘧鏈熺被鍨嬭綆楋紝閫氬父榪欐墠鏄ā鏉垮厓緙栫▼澶ф斁寮傚僵鐨勫湴鏂廣?/p>

妯℃澘鍏冪紪紼嬫妧鏈茍闈為兘鏄紭鐐癸細(xì)

銆銆1.浠g爜鍙鎬у樊錛屼互綾繪ā鏉跨殑鏂瑰紡鎻忚堪綆楁硶涔熻鏈夌偣鎶借薄銆?/p>

銆銆2.璋冭瘯鍥伴毦錛屽厓紼嬪簭鎵ц浜庣紪璇戞湡錛屾病鏈夌敤浜庡崟姝ヨ窡韙厓紼嬪簭鎵ц鐨勮皟璇曞櫒錛堢敤浜庤緗柇鐐廣佸療鐪嬫暟鎹瓑錛夈傜▼搴忓憳鍙仛鐨勫彧鑳芥槸絳夊緟緙栬瘧榪囩▼澶辮觸錛岀劧鍚庝漢宸ョ牬璇戠紪璇戝櫒鍊炬郴鍒板睆騫曚笂鐨勯敊璇俊鎭?/p>

銆銆3.緙栬瘧鏃墮棿闀匡紝閫氬父甯︽湁妯℃澘鍏冪▼搴忕殑紼嬪簭鐢熸垚鐨勪唬鐮佸昂瀵歌姣旀櫘閫氱▼搴忕殑澶э紝

銆銆4.鍙Щ妞嶆ц緝宸紝瀵逛簬妯℃澘鍏冪紪紼嬩嬌鐢ㄧ殑楂樼駭妯℃澘鐗規(guī)э紝涓嶅悓鐨勭紪璇戝櫒鐨勬敮鎸佸害涓嶅悓銆?/p>

鎬葷粨錛?/p>

妯℃澘鍏冪紪紼嬫妧鏈笉閫傜敤鏅氱▼搴忓憳鐨勬棩甯稿簲鐢紝瀹冨父甯鎬細(xì)鍋氫負(fù)綾誨簱寮鍙戠殑鎻愪緵鎶鏈敮鎸侊紝涓哄父瑙勬ā鏉夸唬鐮佺殑鍐呮牳鐨勫叧閿畻娉曞疄鐜版洿濂界殑鎬ц兘鎴栬呯紪璇戞湡綾誨瀷璁$畻銆傛ā鏉垮厓紼嬪簭鍑犱箮鎬繪槸搴旇涓庡父瑙勪唬鐮佺粨鍚堜嬌鐢ㄨ灝佽鍦ㄤ竴涓▼搴忓簱鐨勫唴閮ㄣ傚浜庡簱鐨勭敤鎴鋒潵璇達(dá)紝瀹冨簲璇ユ槸閫忔槑鐨勩?/p>

宸ョ▼搴旂敤瀹炰緥

1. Blitz++錛氱敱浜庢ā鏉垮厓緙栫▼鏈鍏堟槸鍥犱負(fù)鏁板艱綆楄岃鍙戠幇鐨勶紝鍥犳鏃╂湡鐨勭爺絀跺伐浣滀富瑕侀泦涓簬鏁板艱綆楁柟闈紝Blitz++搴撳埄鐢ㄦā鏉垮皢榪愯鏈熻綆楄漿縐昏嚦緙栬瘧鏈熺殑搴擄紝涓昏鎻愪緵浜嗗鍚戦噺銆佺煩闃電瓑榪涜澶勭悊鐨勭嚎鎬т唬鏁拌綆椼?/p>

2.Loki錛氬皢妯℃澘鍏冪紪紼嬪湪綾誨瀷璁$畻鏂歸潰鐨勫▉鍔涘簲鐢ㄤ簬璁捐妯″紡棰嗗煙錛屽埄鐢ㄥ厓緙栫▼錛堜互鍙?qiáng)鍏朵粬涓浜涢噸瑕佺殑璁捐鎶鏈級(jí)瀹炵幇浜嗕竴浜涘父瑙佺殑璁捐妯″紡涔嬫硾鍨嬬増鏈侺oki搴撲腑鐨凙bstract Factory娉涘瀷妯″紡鍗沖熷姪浜庤繖縐嶆満鍒跺疄鐜板湪涓嶆崯澶辯被鍨嬪畨鍏ㄦх殑鍓嶆彁涓嬮檷浣庡綾誨瀷鐨勯潤鎬佷緷璧栨с?/p>

3.Boost錛氬厓緙栫▼搴撶洰鍓嶄富瑕佸寘鍚玀PL銆乀ype Traits鍜孲tatic Assert絳夊簱銆?Static Assert鍜孴ype Traits鐢ㄤ綔MPL鐨勫熀紜銆侭oost Type Traits搴撳寘鍚竴緋誨垪traits綾伙紝鐢ㄤ簬钀冨彇C++綾誨瀷鐗瑰緛銆傚彟澶栬繕鍖呭惈浜嗕竴浜涜漿鎹raits錛堜緥濡傜Щ闄や竴涓被鍨嬬殑const淇グ絎︾瓑錛夈侭oost Static Assert搴撶敤浜庣紪璇戞湡鏂█錛屽鏋滆瘎浼扮殑琛ㄨ揪寮忕紪璇戞椂璁$畻緇撴灉涓簍rue錛屽垯浠g爜鍙互閫氳繃緙栬瘧錛屽惁鍒欑紪璇戞姤閿欍?/p>

鎶鏈粏鑺?/strong>

妯℃澘鍏冪紪紼嬩嬌鐢ㄩ潤鎬丆++璇█鎴愬垎錛岀紪紼嬮鏍肩被浼間簬鍑芥暟寮忕紪紼嬶紝鍦ㄦā鏉垮厓緙栫▼涓紝涓昏鎿嶄綔鏁村瀷錛堝寘鎷竷?yōu)當(dāng)绫诲瀷銆佸瓧絎︾被鍨嬨佹暣鏁扮被鍨嬶級(jí)甯擱噺鍜岀被鍨嬶紝涓嶅彲浠ヤ嬌鐢ㄥ彉閲忋佽祴鍊艱鍙ュ拰榪唬緇撴瀯絳夈傝鎿嶇旱鐨勫疄浣撲篃縐頒負(fù)鍏冩暟鎹紙Metadata錛夛紝鎵鏈夊厓鏁版嵁鍧囧彲浣滀負(fù)妯℃澘鍙傛暟銆?/p>

鐢變簬鍦ㄦā鏉垮厓緙栫▼涓笉鍙互浣跨敤鍙橀噺錛屾垜浠彧鑳戒嬌鐢╰ypedef鍚嶅瓧鍜屾暣鍨嬪父閲忋傚畠浠垎鍒噰鐢ㄤ竴涓被鍨嬪拰鏁存暟鍊艱繘琛屽垵濮嬪寲錛屼箣鍚庝笉鑳藉啀璧嬩簣鏂扮殑綾誨瀷鎴栨暟鍊箋傚鏋滈渶瑕佹柊鐨勭被鍨嬫垨鏁板鹼紝蹇呴』寮曞叆鏂扮殑typedef鍚嶅瓧鎴栧父閲忋?/p>

鍏跺畠鑼冧緥

 

 

References錛?/strong>

http://club.topsage.com/thread-421469-1-1.html

http://wenku.baidu.com/view/c769720df78a6529647d539d.html

Blitz++錛?nbsp;http://www.oonumerics.org/blitz .
Loki 錛?a target="_blank" style="box-sizing: border-box; color: #3468a4;">http://sourceforge.net/projects/loki-lib

Boost錛?a style="box-sizing: border-box; color: #3468a4;">http://www.boost.org/



閼緳 2012-12-01 20:01 鍙戣〃璇勮
]]>Traits 鎶鏈?--- 妯℃澘鍏冪紪紼?(杞? http://m.shnenglu.com/mysileng/archive/2012/12/01/195868.html閼緳閼緳Sat, 01 Dec 2012 11:57:00 GMThttp://m.shnenglu.com/mysileng/archive/2012/12/01/195868.htmlhttp://m.shnenglu.com/mysileng/comments/195868.htmlhttp://m.shnenglu.com/mysileng/archive/2012/12/01/195868.html#Feedback0http://m.shnenglu.com/mysileng/comments/commentRss/195868.htmlhttp://m.shnenglu.com/mysileng/services/trackbacks/195868.html      浠涔堟槸traits錛屼負(fù)浠涔堜漢浠妸瀹冭涓烘槸C++ Generic Programming鐨勯噸瑕佹妧鏈紵

      綆媧佸湴璇達(dá)紝traits濡傛閲嶈錛屾槸鍥犱負(fù)姝ら」鎶鏈厑璁哥郴緇熷湪緙栬瘧鏃舵牴鎹被鍨嬩綔涓浜涘喅鏂紝灝卞ソ鍍忓湪榪愯鏃舵牴鎹兼潵鍋氬嚭鍐蟲柇涓鏍楓傛洿榪涗竴姝ワ紝姝ゆ妧鏈伒寰?#8220;鍙﹀涓涓棿鎺ュ眰”鐨勮皻璇紝瑙e喅浜嗕笉灝戣蔣浠跺伐紼嬮棶棰橈紝traits浣挎?zhèn)ㄨ兘鏍规嵁鍏朵骇鐢熺殑鑳屾?context) 鏉ュ仛鍑烘妷鎷┿傝繖鏍鋒渶緇堢殑浠g爜灝卞彉寰楁竻鏅版槗璇伙紝瀹規(guī)槗緇存姢銆傚鏋滀綘姝g‘榪愮敤浜唗raits鎶鏈紝浣犲氨鑳藉湪涓嶄粯鍑轟換浣曟ц兘鍜屽畨鍏ㄤ唬浠風(fēng)殑鍚屾椂寰楀埌榪欎簺濂藉錛屾垨鑰呰兘澶熷鍚堝叾浠栬В鍐蟲柟妗堜笂鐨勯渶姹傘?br />
      鍏堜婦涓祬鏄炬槗鎳傜殑渚嬪瓙鏉ヨ鏄巘raits鐨勭敤娉曪細(xì)
//棣栧厛鍋囧鏈変互涓嬩竴涓硾鍨嬬殑榪唬鍣ㄧ被錛屽叾涓被鍨嬪弬鏁?nbsp;T 涓鴻凱浠e櫒鎵鎸囧悜鐨勭被鍨嬶細(xì)
template <typename T>
class myIterator
{

};
       閭d箞褰撲嬌鐢╩yIterator鏃訛紝鎬庢牱鎵嶈兘鐭ラ亾瀹冩墍鎸囧悜鍏冪礌鐨勭被鍨嬪憿錛熶竴縐嶈В鍐蟲柟妗堟槸涓鴻繖涓被鍔犲叆涓涓唴宓岀被鍨嬶細(xì)
template <typename T>
class myIterator
{
typedef T value_type;

};
      褰撲嬌鐢╩yIterator鏃訛紝鍙互閫氳繃myIterator::value_type鏉ヨ幏寰楃浉搴旂殑myIterator鎵鎸囧悜鐨勭被鍨嬨備笅闈婦渚嬩嬌鐢細(xì)
template <typename T>
typename myIterator<T>::value_type func(myIterator<T> i)
{

}
      榪欓噷瀹氫箟浜嗕竴涓嚱鏁癴unc錛岃繑鍥炲肩被鍨嬩負(fù)鍙傛暟i鎵鎸囩殑綾誨瀷錛屼篃灝辨槸妯℃澘鍙傛暟T錛岄偅涔堜負(fù)浠涔堜笉鐩存帴浣跨敤妯℃澘鍙傛暟T錛岃岃緇曠潃鍦堝幓浣跨敤閭d釜value_type鍛紵鎵浠ユ垜浠繑鍥炴潵錛屽綋淇敼func鍑芥暟鏃訛紝瀹冭兘澶熼傚簲鎵鏈夌被鍨嬬殑榪唬鍣紝涓嶆槸鏇村ソ鍚楋紵濡備笅鎵紺猴細(xì)
template <typename I> //榪欓噷鐨処鍙互鏄換鎰忕被鍨嬬殑榪唬鍣?/span>
typename I::value_type func(I i)
{

}
      鐜板湪錛屼換鎰忓畾涔変簡value_type鍐呭祵綾誨瀷鐨勮凱浠e櫒閮藉彲浠ュ仛涓篺unc鐨勫弬鏁頒簡錛屽茍涓攆unc鐨勮繑鍥炲肩殑綾誨瀷灝嗕笌鐩稿簲榪唬鍣ㄦ墍鎸囩殑鍏冪礌鐨勭被鍨嬩竴鑷淬傝嚦姝や竴鍒囬棶棰樹技涔庨兘宸茶В鍐籌紝騫朵笖浼間箮騫舵病鏈変嬌鐢ㄤ換浣曠壒孌婄殑鎶鏈?br />      鐒惰屽綋鑰冭檻鍒頒互涓嬫儏鍐墊椂錛屾柊鐨勯棶棰樹究鏄劇幇鍑烘潵浜嗭細(xì)鍘熺敓鎸囬拡涔熷畬鍏ㄥ彲浠ュ仛涓鴻凱浠e櫒鏉ヤ嬌鐢紝鐒惰屾樉鐒舵病鏈夊姙娉曚負(fù)鍘熺敓鎸囬拡娣誨姞涓涓獀alue_type鐨勫唴宓岀被鍨嬶紝濡傛涓鏉unc()鍑芥暟灝變笉鑳介傜敤鍘熺敓鎸囬拡浜嗭紝榪欎笉鑳戒笉璇存槸涓澶х己鎲俱傞偅涔堟湁浠涔堝姙娉曞彲浠ヨВ鍐寵繖涓棶棰樺憿錛熸鏃朵笉紱佹兂鍒頒簡鐢═raits钀冨彇綾誨瀷淇℃伅銆傚彲浠ヤ笉鐩存帴浣跨敤myIterator鐨剉alue_type錛岃屾槸閫氳繃Traits綾繪潵鎶婅繖涓俊鎭彁鍙栧嚭鏉ワ細(xì)(涓嶅悓鐨勭被鍨嬶紝鍙互鏈変笉鍚岀殑鎻愬彇鏂瑰紡)
template <typename T>
class Traits
{
typedef typename T::value_type value_type;
};
      榪欐牱浠ュ悗灝卞彲浠ラ氳繃Traits<myIterator>::value_type鏉ユ彁鍙栧嚭myIterator涓殑value_type錛屼簬鏄痜unc鍑芥暟鏀瑰啓鎴愶細(xì)
template <typename I> //榪欓噷鐨処鍙互鏄換鎰忕被鍨嬬殑榪唬鍣?/span>
typename Traits<I>::value_type Foo(I i)
{

}
      鐒惰岋紝鍗充嬌榪欐牱錛岄偅涓師鐢熸寚閽堢殑闂浠嶇劧娌℃湁瑙e喅錛屽洜涓篢rait綾昏繕鏄病鍔炴硶鑾峰緱鍘熺敓鎸囬拡鐨勭浉鍏充俊鎭備簬鏄笉濡ㄥ皢Traits鍋忕壒鍖?partial specialization)錛?閫氳繃鐗瑰寲銆侀噸杞界壒鍖栫瓑鎵嬫浜у嚭涓嶅悓鐨勬彁鍙栨柟寮?
template <typename T>
class Traits<T*> //娉ㄦ剰 榪欓噷閽堝鍘熺敓鎸囬拡榪涜浜嗗亸鐗瑰寲
{
typedef typename T value_type;
};
     閫氳繃涓婇潰榪欎釜Traits鐨勫亸鐗瑰寲鐗堟湰錛屼竴涓猅*綾誨瀷鐨勬寚閽堟墍鎸囧悜鐨勫厓绱犵殑綾誨瀷涓篢銆傚姝や竴鏉ワ紝鎴戜滑func鍑芥暟灝卞畬鍏ㄥ彲浠ラ傜敤浜庡師鐢熸寚閽堜簡銆傛瘮濡傦細(xì)
int * p;
.
int i = func(p);
     Traits浼?xì)鑷姩鎺ㄥ鍑簆鎵鎸囧厓绱犵殑綾誨瀷涓篿nt錛屼粠鑰宖unc姝g‘榪斿洖銆?/div>
-----------------------------------------------------------------------------------------------------------------------------------------------------------
     鐜板湪鍐嶇湅涓涓洿鍔犱竴鑸殑渚嬪瓙——smart pointers銆?鏅鴻兘鎸囬拡)
     鍋囪浣犳鍦ㄨ璁′竴涓猄martPtr妯℃澘綾伙紝瀵逛簬涓涓猻mart pointer 鏉ヨ錛屽畠鐨勬渶澶х殑鐢ㄥ鏄彲浠ヨ嚜鍔ㄧ鐞嗗唴瀛橀棶棰橈紝鍚屾椂鍦ㄥ叾浠栨柟闈㈠張鍍忎竴涓父瑙勬寚閽堛備絾鏄湁浜汣++鐨凷mart pointer瀹炵幇鎶鏈嵈闈炲父浠や漢闅句互鐞嗚В銆傝繖涓孌嬮叿鐨勪簨瀹炲甫鏉ヤ簡涓涓噸瑕佸疄璺電粡楠岋細(xì)浣犳渶濂藉敖涓鍒囧彲鑳戒竴鍔蟲案閫革紝鍐欏嚭涓涓嚭鑹茬殑銆佸叿鏈夊伐涓氬己搴︾殑 smart pointer鏉ユ弧瓚充綘鎵鏈夌殑闇姹傘傛澶栵紝浣犻氬父涓嶈兘淇敼涓涓被鏉ラ傚簲浣犵殑smart pointer錛屾墍浠ヤ綘鐨凷martPtr涓瀹氳瓚沖鐏墊椿銆?/div>
     鏈変笉灝戠被灞傛浣跨敤寮曠敤璁℃暟(reference counting)浠ュ強(qiáng)鐩稿簲鐨勫嚱鏁扮鐞嗗璞$殑鐢熷瓨鏈熴傜劧鑰岋紝騫舵病鏈塺eference counting鐨勬爣鍑嗗疄鐜版柟娉曪紝姣忎竴涓狢++搴撶殑渚涘簲鍟嗗湪瀹炵幇鐨勮娉曞拰/鎴栬涔変笂閮芥湁鎵涓嶅悓銆備緥濡傦紝鍦ㄤ綘鐨勫簲鐢ㄧ▼搴忎腑鏈夎繖鏍蜂袱涓猧nterfaces錛?br />絎竴縐嶆櫤鑳芥寚閽?-澶ч儴鍒嗙殑綾誨疄鐜頒簡RefCounted鎺ュ彛:
class RefCounted
{
public:
virtual void IncRef() = 0;
virtual bool DecRef() = 0;
// if you DecRef() to zero references, the object is destroyed
// automatically and DecRef() returns true
virtual ~RefCounted() {}
};
絎簩縐嶆櫤鑳芥寚閽?-絎笁鏂規(guī)彁渚涚殑Widget綾諱嬌鐢ㄤ笉鍚岀殑鎺ュ彛錛?/div>
class Widget
{
public:
void AddReference();
int RemoveReference(); 
// returns the remaining number of references; it's the client's
// responsibility to destroy the object

};
      涓嶈繃浣犲茍涓嶆兂緇存姢涓や釜smart pointer綾伙紝浣犳兂璁╀袱縐嶇被鍏變韓涓涓猄martPtr銆備竴涓熀浜巘raits鐨勮В鍐蟲柟妗堟妸涓ょ涓嶅悓鐨勬帴鍙g敤璇硶鍜岃涔変笂緇熶竴鐨勬帴鍙e寘瑁呰搗鏉ワ紝寤虹珛閽堝鏅氱被鐨勯氱敤妯℃澘錛岃岄拡瀵筗idget寤虹珛涓涓壒孌婂寲鐗堟湰錛屽涓嬶細(xì)
template <class T>
class RefCountingTraits
{
static void Refer(T* p)
{
p->IncRef(); // assume RefCounted interface
}
static void Unrefer(T* p)
{
p->DecRef(); //assume RefCounted interface
}
};
template<>
class RefCountingTraits<Widget>
{
static void Refer(Widget* p)
{
p->AddReference(); //use Widget interface
}
static void Unrefer(Widget* p)
{
//use Widget interface
If (p->RemoveReference() == 0)
delete p;
}
};
      鍦⊿martPtr閲岋紝鎴戜滑鍍忚繖鏍蜂嬌鐢≧efCountingTraits:
template <class T>
class SmartPtr
{
private:
typedef RefCountingTraits<T> RCTraits;
T* pointee_;
public:

~SmartPtr()
{
RCTraits::Unrefer(pointee_);
}
};
      褰撶劧鍦ㄤ笂闈㈢殑渚嬪瓙閲岋紝浣犲彲鑳戒細(xì)浜夎璇翠綘鍙互鐩存帴鐗規(guī)畩鍖朩idget綾葷殑SmartPtr鐨勬瀯閫犱笌鏋愭瀯鍑芥暟銆備綘鍙互浣跨敤鎶婃ā鏉跨壒孌婂寲鎶鏈敤鍦?SmartPtr鏈韓錛岃屼笉鏄敤鍦╰raits涓婂ご錛岃繖鏍瘋繕鍙互娑堥櫎棰濆鐨勭被銆傚敖綆″榪欎釜闂鏉ヨ榪欑鎯蟲硶娌¢敊錛屼絾榪樻槸鐢變竴浜涗綘闇瑕佹敞鎰忕殑緙洪櫡錛?/div>
  1. 榪欎箞騫茬己涔忓彲鎵╁睍鎬с傚鏋滅粰SmartPtr鍐嶅鍔犱竴涓ā鏉垮弬鏁幫紝浣犱笉鑳界壒孌婂寲榪欐牱涓涓猄martPtr<T. U>錛屽叾涓ā鏉垮弬鏁癟鏄疻idget錛岃孶鍙互涓哄叾浠栦換浣曠被鍨嬨?/li>
  2. 鏈緇堜唬鐮佷笉閭d箞娓呮櫚銆俆rait鏈変竴涓悕瀛楋紝鑰屼笖鎶婄浉鍏崇殑涓滆タ寰堝ソ鐨勭粍緇囪搗鏉ワ紝鍥犳浣跨敤traits鐨勪唬鐮佹洿鍔犲鏄撶悊瑙c傜浉姣斾箣涓嬶紝鐢ㄧ洿鎺ョ壒孌婂寲SmartPtr鎴愬憳鍑芥暟鐨勪唬鐮侊紝鐪嬩笂鍘繪洿鎷涢粦瀹㈢殑鍠滄銆?/li>
      鐢ㄧ戶鎵挎満鍒剁殑瑙e喅鏂規(guī)錛屽氨綆楁湰韜畬緹庢棤鐟曪紝涔熻嚦灝戝瓨鍦ㄤ笂榪扮殑緙洪櫡銆傝В鍐寵繖鏍蜂竴涓彉浣撻棶棰橈紝浣跨敤緇ф壙瀹炲湪鏄お絎ㄩ噸浜嗐傛澶栵紝閫氬父鐢ㄤ互鍙栦唬緇ф壙鏂規(guī)鐨勫彟涓縐嶇粡鍏告満鍒?#8212;—containment錛岀敤鍦ㄨ繖閲屼篃鏄懼緱鐢昏泧娣昏凍錛岀箒鐞愪笉鍫傜浉鍙嶏紝traits鏂規(guī)騫插噣鍒╄惤錛岀畝鏄庢湁鏁堬紝鐗╁悎鍏剁敤錛屾伆鍒板ソ澶勩?/div>
      Traits鐨勪竴涓噸瑕佺殑搴旂敤鏄?#8220;interface glue”錛堟帴鍙h兌鍚堝墏錛夛紝閫氱敤鐨勩佸彲閫傚簲鎬ф瀬寮虹殑閫傞厤瀛愩傚鏋滀笉鍚岀殑綾誨浜庝竴涓粰瀹氱殑姒傚康鏈夌潃涓嶅悓鐨勫疄鐜幫紝traits鍙互鎶婅繖浜涘疄鐜板啀緇勭粐緇熶竴鎴愪竴涓叕鍏辯殑鎺ュ彛銆傚浜庝竴涓粰瀹氱被鍨嬫彁渚涘縐峊RAITS錛氱幇鍦紝鎴戜滑鍋囪鎵鏈夌殑浜洪兘寰堝枩嬈綘鐨凷martPtr妯℃澘綾伙紝鐩村埌鏈変竴澶╋紝鍦ㄤ綘鐨勫綰跨▼搴旂敤紼嬪簭閲屽紑濮嬬幇浜嗙縐樼殑bug銆備綘鍙戠幇緗瓉紲擱鏄疻idget錛屽畠鐨勫紩鐢ㄨ鏁板嚱鏁板茍涓嶆槸綰跨▼瀹夊叏鐨勩傜幇鍦ㄤ綘涓嶅緱涓嶄翰鑷疄鐜癢idget:: AddReference鍜學(xué)idget::RemoveReference錛屾渶鍚堢悊鐨勪綅緗簲璇ユ槸鍦≧efCountingTraits涓紝鎵撲笂涓ˉ涓佸惂錛?/div>
// Example 7: Patching Widget's traits for thread safety
template <>
class RefCountingTraits<Widget>
{
static void Refer(Widget* p)
{
Sentry s(lock_); // serialize access
p->AddReference();
}
static void Unrefer(Widget* p)
{
Sentry s(lock_); // serialize access
if (p->RemoveReference() == 0)
delete p;
}
private:
static Lock lock_;
};
       涓嶅垢鐨勬槸錛岃櫧鐒朵綘閲嶆柊緙栬瘧銆佹祴璇曚箣鍚庢紜繍琛岋紝浣嗘槸紼嬪簭鎱㈠緱鍍忚湕鐗涖備粩緇嗗垎鏋愪箣鍚庡彂鐜幫紝浣犲垰鎵嶇殑鎵浣滄墍涓哄線紼嬪簭閲屽浜嗕竴涓碂緋曠殑鐡墮銆傚疄闄呬笂鍙湁灝戞暟鍑犱釜Widget鏄渶瑕佽兘澶熻濂藉嚑涓嚎紼嬭闂殑錛屼綑涓嬬殑緇濆ぇ澶氭暟Widget閮芥槸鍙涓涓嚎紼嬭闂殑銆備綘瑕佸仛鐨勬槸鍛婅瘔緙栬瘧鍣ㄦ寜浣犵殑闇姹傚垎鍒嬌鐢ㄥ綰跨▼traits鍜屽崟綰跨▼traits榪欎袱涓笉鍚岀増鏈備綘鐨勪唬鐮佷富瑕佷嬌鐢ㄥ崟綰跨▼traits銆?/div>
       濡備綍鍛婅瘔緙栬瘧鍣ㄤ嬌鐢ㄥ摢涓猼raits錛熶竴縐嶆柟娉曟槸鎶妕raits浣滀負(fù)鍙︿竴涓ā鏉垮弬鏁頒紶緇橲martPtr銆傜己鐪佹儏鍐典笅浼犻掕佸紡鐨則raits妯℃澘錛岃岀敤鐗瑰畾鐨勭被鍨嬪疄渚嬪寲鐗瑰畾鐨勬ā鏉褲?/div>
template <class T, class RCTraits = RefCountingTraits<T> >
class SmartPtr
{

};
      浣犲鍗曠嚎紼嬬増鐨凴efCountingTraits<Widget>涓嶅仛鏀瑰姩錛岃屾妸澶氱嚎紼嬬増鏀懼湪涓涓崟鐙殑綾諱腑錛?/div>
class MtRefCountingTraits
{
static void Refer(Widget* p)
{
Sentry s(lock_); // serialize access
p->AddReference();
}
static void Unrefer(Widget* p)
{
Sentry s(lock_); // serialize access
if (p->RemoveReference() == 0)
delete p;
}
private:
static Lock lock_;
};
       鐜板湪浣犲彲灝哠martPtr<Widget>鐢ㄤ簬鍗曠嚎紼嬬洰鐨勶紝灝哠martPtr<Widget,MtRefCountingTraits>鐢ㄤ簬澶氱嚎紼嬬洰鐨勩?/div>
       鏈鍚庯紝浠GI STL涓殑__type_traits緇撴潫鏈瘒璁ㄨ錛屽湪SGI 瀹炵幇鐗堢殑STL涓紝涓轟簡鑾峰彇楂樻晥鐜囷紝鎻愪緵浜哶_type_traits錛岀敤鏉ユ彁鍙栫被鐨勪俊鎭紝姣斿綾繪槸鍚︽嫢鏈塼rival鐨勬瀯閫犮佹瀽鏋勩佹嫹璐濄佽祴鍊兼搷浣滐紝鐒跺悗璺熸嵁鍏蜂綋鐨勪俊鎭紝灝卞彲鎻愪緵鏈鏈夋晥鐜囩殑鎿嶄綔銆備互涓嬫憳褰昪ygwin鐨刧cc3.3婧愮爜錛屾湁鏀瑰姩錛屽湪<type_traits.h>涓?/div>
struct __true_type {};
struct __false_type {};
template <class _Tp>
struct __type_traits
{
typedef __true_type    this_dummy_member_must_be_first;
typedef __false_type    has_trivial_default_constructor;
typedef __false_type    has_trivial_copy_constructor;
typedef __false_type    has_trivial_assignment_operator;
typedef __false_type    has_trivial_destructor;
typedef __false_type    is_POD_type;
};
        瀵逛簬鏅氱被鏉ヨ錛屼負(fù)浜嗗畨鍏ㄨ搗瑙侊紝閮借涓哄畠浠嫢鏈塶on-trival鐨勬瀯閫犮佹瀽鏋勩佹嫹璐濄佽祴鍊煎嚱鏁幫紝POD鏄寚plain old data銆傛帴涓嬫潵瀵笴++鐨勫師鐢熺被鍨嬶紙bool錛宨nt錛?double涔嬬被錛夊畾涔変簡鏄懼紡鐨勭壒鍖栧疄鐜幫紝浠ouble涓轟緥錛?/div>
template<> 
struct __type_traits<long double> {
typedef __true_type    has_trivial_default_constructor;
typedef __true_type    has_trivial_copy_constructor;
typedef __true_type    has_trivial_assignment_operator;
typedef __true_type    has_trivial_destructor;
typedef __true_type    is_POD_type;
};
榪樻湁錛屽鎵鏈夌殑鍘熺敓鎸囬拡鏉ヨ錛屽畠浠殑鏋勯犮佹瀽鏋勭瓑鎿嶄綔涔熸槸trival鐨勶紝鍥犳鏈夛細(xì)
template <class _Tp>
struct __type_traits<_Tp*> {
typedef __true_type    has_trivial_default_constructor;
typedef __true_type    has_trivial_copy_constructor;
typedef __true_type    has_trivial_assignment_operator;
typedef __true_type    has_trivial_destructor;
typedef __true_type    is_POD_type;
};
      綆鍖?lt;stl_algobase.h>涓璫opy鐨勯儴鍒嗕唬鐮佹潵璇存槑瀵筥_type_traits鐨勫簲鐢ㄣ?/div>
template<typename _Tp>
inline _Tp* __copy_trivial(const _Tp* __first, const _Tp* __last, _Tp* __result)
{
memmove(__result, __first, sizeof(_Tp) * (__last - __first));
return __result + (__last - __first);
}
template<typename _Tp>
inline _Tp* __copy_aux (_Tp* __first, _Tp* __last, _Tp* __result, __true_type)
return __copy_trivial(__first, __last, __result); } 
template<typename _Tp>
inline _Tp* __copy_aux (_Tp* __first, _Tp* __last, _Tp* __result, __false_type)
{ 鍙﹀澶勭悊錛泒
template<typename _InputIter, typename _OutputIter> inline 
_OutputIter copy (_InputIter __first, _InputIter __last, _OutputIter __result)
{
typedef typename iterator_traits<_InputIter>::value_type _ValueType;
typedef typename __type_traits<_ValueType>::has_trivial_assignment_operator _Trivial;
return __copy_aux(__first, __last, __result, _Trivial());
}
      Copy 鍑芥暟鍒╃敤__type_traits鍒ゆ柇褰撳墠鐨剉alue_type鏄惁鏈塼rival鐨勮祴鍊兼搷浣滐紝濡傛灉鏄紝鍒欎駭鐢熺被__true_type鐨勫疄渚嬶紝緙栬瘧 鏃墮夋嫨__copy_trivial鍑芥暟榪涜memmove錛屾晥鐜囨渶楂樸傚鏋滄槸non-trival鐨勮祴鍊兼搷浣滐紝鍒欏彟浣滃鐞嗭紝鏁堢巼鑷劧浣庝簺銆俖_true_type鍜宊_false_type涔嬫墍浠ユ槸綾伙紝灝卞洜涓篊++鐨勫嚱鏁伴噸杞芥槸鏍規(guī)嵁綾誨瀷淇℃伅鏉ョ殑錛屼笉鑳戒緷鎹弬鏁板兼潵鍒ゅ埆銆備嬌鐢⊿GI STL鏃訛紝鍙互涓鴻嚜宸辯殑綾誨畾涔塤_type_traits鏄懼紡鐗瑰寲鐗堟湰錛屼互姹傝揪鍒伴珮鏁堢巼銆?/div>
鏈枃鏉ヨ嚜CSDN鍗氬錛岃漿杞借鏍囨槑鍑哄錛歨ttp://blog.csdn.net/budTang/archive/2008/05/06/2397013.aspx


閼緳 2012-12-01 19:57 鍙戣〃璇勮
]]>C++綾誨瀷杞崲鎬葷粨(杞?http://m.shnenglu.com/mysileng/archive/2012/11/25/195650.html閼緳閼緳Sun, 25 Nov 2012 09:33:00 GMThttp://m.shnenglu.com/mysileng/archive/2012/11/25/195650.htmlhttp://m.shnenglu.com/mysileng/comments/195650.htmlhttp://m.shnenglu.com/mysileng/archive/2012/11/25/195650.html#Feedback0http://m.shnenglu.com/mysileng/comments/commentRss/195650.htmlhttp://m.shnenglu.com/mysileng/services/trackbacks/195650.htmlC椋庢牸鐨勫己鍒剁被鍨嬭漿鎹?Type Cast)寰堢畝鍗曪紝涓嶇浠涔堢被鍨嬬殑杞崲緇熺粺鏄細(xì)
TYPE b = (TYPE)a銆?br />C++椋庢牸鐨勭被鍨嬭漿鎹㈡彁渚涗簡4縐嶇被鍨嬭漿鎹㈡搷浣滅鏉ュ簲瀵逛笉鍚屽満鍚堢殑搴旂敤銆?/p>

const_cast錛屽瓧闈笂鐞嗚В灝辨槸鍘籧onst灞炴с?br />static_cast錛屽懡鍚嶄笂鐞嗚В鏄潤鎬佺被鍨嬭漿鎹€傚int杞崲鎴恈har銆?br />dynamic_cast錛屽懡鍚嶄笂鐞嗚В鏄姩鎬佺被鍨嬭漿鎹€傚瀛愮被鍜岀埗綾諱箣闂寸殑澶氭佺被鍨嬭漿鎹€?br />reinterpret_cast錛屼粎浠呴噸鏂拌В閲婄被鍨嬶紝浣嗘病鏈夎繘琛屼簩榪涘埗鐨勮漿鎹€?br />4縐嶇被鍨嬭漿鎹㈢殑鏍煎紡錛屽錛歍YPE B = static_cast(TYPE)(a)銆?/p>

const_cast
鍘繪帀綾誨瀷鐨刢onst鎴杤olatile灞炴с?/p>

1 struct SA {
2 int i;
3 };
4 const SA ra;
5 //ra.i = 10; //鐩存帴淇敼const綾誨瀷錛岀紪璇戦敊璇?/span>
6 SA &rb = const_cast<SA&>(ra);
7 rb.i = 10;

static_cast

綾諱技浜嶤椋庢牸鐨勫己鍒惰漿鎹€傛棤鏉′歡杞崲錛岄潤鎬佺被鍨嬭漿鎹€傜敤浜庯細(xì)
1. 鍩虹被鍜屽瓙綾諱箣闂磋漿鎹細(xì)鍏朵腑瀛愮被鎸囬拡杞崲鎴愮埗綾繪寚閽堟槸瀹夊叏鐨勶紱浣嗙埗綾繪寚閽堣漿鎹㈡垚瀛愮被鎸囬拡鏄笉瀹夊叏鐨勩?鍩虹被鍜屽瓙綾諱箣闂寸殑鍔ㄦ佺被鍨嬭漿鎹㈠緩璁敤dynamic_cast)
2. 鍩烘湰鏁版嵁綾誨瀷杞崲銆俥num, struct, int, char, float絳夈俿tatic_cast涓嶈兘榪涜鏃犲叧綾誨瀷錛堝闈炲熀綾誨拰瀛愮被錛夋寚閽堜箣闂寸殑杞崲銆?br />3. 鎶婄┖鎸囬拡杞崲鎴愮洰鏍囩被鍨嬬殑絀烘寚閽堛?br />4. 鎶婁換浣曠被鍨嬬殑琛ㄨ揪寮忚漿鎹㈡垚void綾誨瀷銆?br />5. static_cast涓嶈兘鍘繪帀綾誨瀷鐨刢onst銆乿olitale灞炴?鐢╟onst_cast)銆?/p>

1 int n = 6;
2 double d = static_cast<double>(n); // 鍩烘湰綾誨瀷杞崲
3 int *pn = &n;
4 double *d = static_cast<double *>(&n) //鏃犲叧綾誨瀷鎸囬拡杞崲錛岀紪璇戦敊璇?/span>
5 void *p = static_cast<void *>(pn); //浠繪剰綾誨瀷杞崲鎴恦oid綾誨瀷

dynamic_cast
鏈夋潯浠惰漿鎹紝鍔ㄦ佺被鍨嬭漿鎹紝榪愯鏃剁被鍨嬪畨鍏ㄦ鏌?杞崲澶辮觸榪斿洖NULL)錛?br />1. 瀹夊叏鐨勫熀綾誨拰瀛愮被涔嬮棿杞崲銆?br />2. 蹇呴』瑕佹湁铏氬嚱鏁般?br />3. 鐩稿悓鍩虹被涓嶅悓瀛愮被涔嬮棿鐨勪氦鍙夎漿鎹€備絾緇撴灉鏄疦ULL銆?/p>

 1 class BaseClass {
2 public:
3 int m_iNum;
4 virtual void foo(){}; //鍩虹被蹇呴』鏈夎櫄鍑芥暟銆備繚鎸佸鍙扮壒鎬ф墠鑳戒嬌鐢╠ynamic_cast
5 };
6
7 class DerivedClass: public BaseClass {
8 public:
9 char *m_szName[100];
10 void bar(){};
11 };
12
13 BaseClass* pb = new DerivedClass();
14 DerivedClass *pd1 = static_cast<DerivedClass *>(pb); //瀛愮被->鐖剁被錛岄潤鎬佺被鍨嬭漿鎹紝姝g‘浣嗕笉鎺ㄨ崘
15 DerivedClass *pd2 = dynamic_cast<DerivedClass *>(pb); //瀛愮被->鐖剁被錛屽姩鎬佺被鍨嬭漿鎹紝姝g‘
16
17 BaseClass* pb2 = new BaseClass();
18 DerivedClass *pd21 = static_cast<DerivedClass *>(pb2); //鐖剁被->瀛愮被錛岄潤鎬佺被鍨嬭漿鎹紝鍗遍櫓錛佽闂瓙綾籱_szName鎴愬憳瓚婄晫
19 DerivedClass *pd22 = dynamic_cast<DerivedClass *>(pb2); //鐖剁被->瀛愮被錛屽姩鎬佺被鍨嬭漿鎹紝瀹夊叏鐨勩傜粨鏋滄槸NULL

reinterpret_cast
浠呬粎閲嶆柊瑙i噴綾誨瀷錛屼絾娌℃湁榪涜浜岃繘鍒剁殑杞崲錛?br />1. 杞崲鐨勭被鍨嬪繀欏繪槸涓涓寚閽堛佸紩鐢ㄣ佺畻鏈被鍨嬨佸嚱鏁版寚閽堟垨鑰呮垚鍛樻寚閽堛?br />2. 鍦ㄦ瘮鐗逛綅綰у埆涓婅繘琛岃漿鎹€傚畠鍙互鎶婁竴涓寚閽堣漿鎹㈡垚涓涓暣鏁幫紝涔熷彲浠ユ妸涓涓暣鏁拌漿鎹㈡垚涓涓寚閽堬紙鍏堟妸涓涓寚閽堣漿鎹㈡垚涓涓暣鏁幫紝鍦ㄦ妸璇ユ暣鏁拌漿鎹㈡垚鍘熺被鍨嬬殑鎸囬拡錛岃繕鍙互寰楀埌鍘熷厛鐨勬寚閽堝鹼級(jí)銆備絾涓嶈兘灝嗛潪32bit鐨勫疄渚嬭漿鎴愭寚閽堛?br />3. 鏈鏅氱殑鐢ㄩ斿氨鏄湪鍑芥暟鎸囬拡綾誨瀷涔嬮棿榪涜杞崲銆?br />4. 寰堥毦淇濊瘉縐繪鎬с?/p>

1 int doSomething(){return 0;};
2 typedef void(*FuncPtr)(); //FuncPtr is 涓涓寚鍚戝嚱鏁扮殑鎸囬拡錛岃鍑芥暟娌℃湁鍙傛暟錛岃繑鍥炲肩被鍨嬩負(fù) void
3 FuncPtr funcPtrArray[10]; //10涓狥uncPtrs鎸囬拡鐨勬暟緇?璁╂垜浠亣璁句綘甯屾湜錛堝洜涓烘煇浜涜帿鍚嶅叾濡欑殑鍘熷洜錛夋妸涓涓寚鍚戜笅闈㈠嚱鏁扮殑鎸囬拡瀛樺叆funcPtrArray鏁扮粍錛?/span>
4
5 funcPtrArray[0] = &doSomething;// 緙栬瘧閿欒錛佺被鍨嬩笉鍖歸厤錛宺einterpret_cast鍙互璁╃紪璇戝櫒浠ヤ綘鐨勬柟娉曞幓鐪嬪緟瀹冧滑錛歠uncPtrArray
6 funcPtrArray[0] = reinterpret_cast<FuncPtr>(&doSomething); //涓嶅悓鍑芥暟鎸囬拡綾誨瀷涔嬮棿榪涜杞崲

鎬葷粨
鍘籧onst灞炴х敤const_cast銆?br />鍩烘湰綾誨瀷杞崲鐢╯tatic_cast銆?br />澶氭佺被涔嬮棿鐨勭被鍨嬭漿鎹㈢敤daynamic_cast銆?br />涓嶅悓綾誨瀷鐨勬寚閽堢被鍨嬭漿鎹㈢敤reinterpret_cast銆?/p>

閼緳 2012-11-25 17:33 鍙戣〃璇勮
]]>
c++ cout 鏍煎紡鍖栬緭鍑?杞?http://m.shnenglu.com/mysileng/archive/2012/11/19/195358.html閼緳閼緳Mon, 19 Nov 2012 06:42:00 GMThttp://m.shnenglu.com/mysileng/archive/2012/11/19/195358.htmlhttp://m.shnenglu.com/mysileng/comments/195358.htmlhttp://m.shnenglu.com/mysileng/archive/2012/11/19/195358.html#Feedback0http://m.shnenglu.com/mysileng/comments/commentRss/195358.htmlhttp://m.shnenglu.com/mysileng/services/trackbacks/195358.html

cout 鏍煎紡鍖栬緭鍑?/a>


灝?cout 鐨?flag 淇濆瓨鍒板彉閲?/strong>, 浠ヤ究淇敼鍚庣殑鎭㈠


灝?bool 鍊間互 literals 杈撳嚭

cout <<"numeric : " <<true <<" or " <<false <<endl ; // 1 or 0 cout <<"literals : " <<boolalpha <<true <<" or " <<false <<endl ; // true or false cout <<"literals : " <<boolalpha <<0 <<endl ; // 0 鍘熷洜: 0 鍦╟out涓笉絳変環(huán)浜?false

涓鏃︽垜浠嬌鐢?boolalpha 灝嗘敼鍙?cout 瀵?bool 鍊肩殑杈撳嚭鏍煎紡. 姝ゅ悗鐨?cout 閮戒細(xì)灝?bool 杈撳嚭涓?literals.


灝?bool 鍊間互 numeric 杈撳嚭

cout <<"numeric : " <<noboolalpha <<true <<" or " <<false <<endl ;// 1 or 0

浠庢浠ュ悗, cout 瀵?bool 鍊肩殑杈撳嚭灝嗘仮澶?numeric 鏍煎紡


鎸囧畾 Integral Values 鐨?Base

const int ival = 17 ; // 'ival' is constant, so value never change cout <<"oct : " <<oct <<ival <<endl ; // 21 : 8 榪涘埗 cout <<"dec : " <<dec <<ival <<endl ; // 17 : 10 榪涘埗 cout <<"hex : " <<hex <<ival <<endl ; // 11 : 16 榪涘埗 cout <<"hex : " <<hex <<17.01 <<endl ; // 17.01 : 涓嶅彈褰卞搷
濡?boolalpha 涓鏍? oct, dec, hex 涔熸槸 persistent. 涓鏃︽敼鍙? 灝嗗獎(jiǎng)鍝嶅悗緇殑杈撳嚭鏍煎紡.


鏄劇ず琛ㄦ槑 Integer Values 鐨?Base

cout <<showbase ; // Show base when printing integral values cout <<"oct : " <<oct <<ival <<endl ; // 21 : 8 榪涘埗 cout <<"dec : " <<dec <<ival <<endl ; // 017 : 10 榪涘埗 cout <<"hex : " <<hex <<ival <<endl ; // 0x11 : 16 榪涘埗 cout <<"hex : " <<hex <<17.01 <<endl ; // 17.01 : 涓嶅彈褰卞搷 cout <<noshowbase ; // Reset state of the stream

鑻ユ兂鏀瑰彉16榪涘埗瀛楁瘝鐨勫ぇ灝?/strong>, 鍙互緇撳悎 uppercase/nouppercase

cout <<showbase <<uppercase ; cout <<"hex : " <<hex <<15 <<endl ; // 0XF 澶у啓褰㈠紡 cout <<nouppercase ; cout <<"hex : " <<hex <<15 <<endl ; // 0xf 灝忓啓褰㈠紡

showbase 涓?noshowbase 鐨勪綔鐢ㄥ懆鏈熶篃鏄?persistent


瀵逛簬 float/double 鍨? 鏈変笁縐嶆牸寮忓寲鎺у埗

涓: 杈撳嚭綺懼害 precision : by default is 6 pricision
   鎺у埗浜嗚嚦澶氫竴鍏變細(xì)杈撳嚭澶氬皯涓暟瀛?  
   褰撹杈撳嚭鐨勬暟瀛楀浣欐寚瀹氱殑鍊兼椂, 灝嗗彂鐢?鍥涜垗浜斿叆(rounded);  
   褰撹杈撳嚭鐨勬暟瀛楀皯浜庢寚瀹氱殑鍊兼椂, 鍒欏疄闄呰緭鍑虹殑鏁板瓧涓暟灝嗗皯浜庢寚瀹氬?
// cout.pricision(4) ; // 絳変環(huán)浜?cout <<setprecision(4) ; cout <<setprecision(4) <<12.345678 <<endl ; // 12.35 rounded! cout <<setprecision(10) <<12.345678 <<endl ; // 12.345678 鍏跺疄鍐呴儴鍙戠敓浜?rounded, 鑰岀粨鏋滄濂借繘浣? 涓庡師鍊肩浉鍚?/span> cout <<cout.precision() <<endl ; // 杈撳嚭褰撳墠綺懼害
 浜? 琛ㄧ幇褰㈠紡 notation : 'very large and very small values are printed using scientific notation. other values use fixed decimal.'
   notation 鎺у埗浜嗚緭鍑虹殑褰㈠紡 : 縐戝璁℃暟娉?scientific) 鍜?瀹氱偣灝忔暟(fixed)
float f = 101 / 6.0 ; cout <<fixed <<f <<endl ; // 16.83334 : 灝忔暟鐐瑰悗鍏?浣?/span> cout <<scientific <<f <<endl ; // 1.683333e+001 : 灝忔暟鐐瑰悗鍏?浣?/span>
  鎭㈠鍒板垵濮嬬姸鎬?br />
cout.unsetf(ostream::floatfield) ; // Retrieve to default handling for notation cout <<f <<endl ; // 16.8333 : 鎵鏈夋暟瀛楀叡6浣?/span>
 涓? 杈撳嚭鍗佽繘鍒舵誕鐐?/strong> 'By default, when the fractional part of a floating-point value is 0, the decimal point is not displayed. The showpoint manipulator forces the decimal point ot be printed.'
cout <<10.0 <<endl ; // 10 cout <<showpoint <<10.0 <<endl ; // 10.0000 cout <<noshowpoint <<endl ; // Revert to default handling of decimal  


杈撳嚭濉厖 
Padding the Output

   setw to specify the minimum space for the next numeric or string value.
cout <<setw(10) <<12.3 <<endl ; // ______12.3 cout <<setw(10) <<12 <<3 <<endl ; // ________123 cout <<setw(3) <<12.345 <<endl ; // If the total output is more than 3, it can be extended
 
   left to left-justify the output.
cout <<left ; // left-justify cout <<setw(5) <<12 <<setw(5) <<34 <<endl ; // 12___34___
 
   right to right-justify the output. Output is right-justified bu default.
cout <<right ; // By default cout <<setw(5) <<12 <<setw(5) <<34 <<endl ; // 12___34___
 
   internal controls placement of the sign on negative value. internal left-justifies the sign and right-justifies the value, padding any intervening space with blanks.(if setfill not set) 
cout <<internal ; // By default cout <<setw(5) <<-12 <<endl ; // 12___34___
 
   setfill lets us specify an alternative character to use when padding the output. By default, the value is a space.
cout <<setfill('*') ; // By default cout <<setw(5) <<12 <<endl ; // 12___34___
 

Header Files

   Manipulators Defined in <iomanip>
setfill(char ch) Fill whitespace with 'ch' setprecision(int n) Set floating-point precision to 'n' setw(int w) Read or write value to 'w' characters setbase(int b) Output integers in base 'b'(only 'b' is 8/10/16 could the function work)


閼緳 2012-11-19 14:42 鍙戣〃璇勮
]]>
c++鍐呭瓨娉勯湶鏈哄埗(杞?http://m.shnenglu.com/mysileng/archive/2012/11/06/194769.html閼緳閼緳Tue, 06 Nov 2012 13:04:00 GMThttp://m.shnenglu.com/mysileng/archive/2012/11/06/194769.htmlhttp://m.shnenglu.com/mysileng/comments/194769.htmlhttp://m.shnenglu.com/mysileng/archive/2012/11/06/194769.html#Feedback0http://m.shnenglu.com/mysileng/comments/commentRss/194769.htmlhttp://m.shnenglu.com/mysileng/services/trackbacks/194769.html瀵逛簬涓涓猚/c++紼嬪簭鍛樻潵璇達(dá)紝鍐呭瓨娉勬紡鏄竴涓父瑙佺殑涔熸槸浠や漢澶寸柤鐨勯棶棰樸傚凡緇忔湁璁稿鎶鏈鐮旂┒鍑烘潵浠ュ簲瀵硅繖涓棶棰橈紝姣斿 Smart Pointer錛孏arbage Collection絳夈係mart Pointer鎶鏈瘮杈冩垚鐔燂紝STL涓凡緇忓寘鍚敮鎸丼mart Pointer鐨刢lass錛屼絾鏄畠鐨勪嬌鐢ㄤ技涔庡茍涓嶅箍娉涳紝鑰屼笖瀹冧篃涓嶈兘瑙e喅鎵鏈夌殑闂錛汫arbage Collection鎶鏈湪Java涓凡緇忔瘮杈冩垚鐔燂紝浣嗘槸鍦╟/c++棰嗗煙鐨勫彂灞曞茍涓嶉『鐣咃紝铏界劧寰堟棭灝辨湁浜烘濊冨湪C++涓篃鍔犲叆GC鐨勬敮鎸併傜幇瀹炰笘鐣屽氨鏄繖鏍風(fēng)殑錛屼綔涓轟竴涓猚/c++紼嬪簭鍛橈紝鍐呭瓨娉勬紡鏄綘蹇冧腑姘歌繙鐨勭棝銆備笉榪囧ソ鍦ㄧ幇鍦ㄦ湁璁稿宸ュ叿鑳藉甯姪鎴戜滑楠岃瘉鍐呭瓨娉勬紡鐨勫瓨鍦紝鎵懼嚭鍙戠敓闂鐨勪唬鐮併?/span>

銆銆鍐呭瓨娉勬紡鐨勫畾涔?/strong> 

銆 銆涓鑸垜浠父璇寸殑鍐呭瓨娉勬紡鏄寚鍫嗗唴瀛樼殑娉勬紡銆傚爢鍐呭瓨鏄寚紼嬪簭浠庡爢涓垎閰嶇殑錛屽ぇ灝忎換鎰忕殑錛堝唴瀛樺潡鐨勫ぇ灝忓彲浠ュ湪紼嬪簭榪愯鏈熷喅瀹氾級(jí)錛屼嬌鐢ㄥ畬鍚庡繀欏繪樉紺洪噴鏀劇殑鍐?瀛樸傚簲鐢ㄧ▼搴忎竴鑸嬌鐢╩alloc錛宺ealloc錛宯ew絳夊嚱鏁頒粠鍫嗕腑鍒嗛厤鍒頒竴鍧楀唴瀛橈紝浣跨敤瀹屽悗錛岀▼搴忓繀欏昏礋璐g浉搴旂殑璋冪敤free鎴杁elete閲婃斁璇?鍐呭瓨鍧楋紝鍚﹀垯錛岃繖鍧楀唴瀛樺氨涓嶈兘琚啀嬈′嬌鐢紝鎴戜滑灝辮榪欏潡鍐呭瓨娉勬紡浜嗐備互涓嬭繖孌靛皬紼嬪簭婕旂ず浜嗗爢鍐呭瓨鍙戠敓娉勬紡鐨勬儏褰細(xì)

void MyFunction(int nSize)
{
銆char* p= new char[nSize];
銆if( !GetStringFrom( p, nSize ) ){
銆銆MessageBox(“Error”);
銆銆return;
銆}
銆…//using the string pointed by p;
銆delete p;
}

銆銆渚嬩竴

銆銆褰撳嚱鏁癎etStringFrom()榪斿洖闆剁殑鏃跺欙紝鎸囬拡p鎸囧悜鐨勫唴瀛樺氨涓嶄細(xì)琚噴鏀俱傝繖鏄竴縐嶅父瑙佺殑鍙戠敓鍐呭瓨娉勬紡鐨勬儏褰€傜▼搴忓湪鍏ュ彛澶勫垎閰嶅唴瀛橈紝鍦ㄥ嚭鍙e閲婃斁鍐呭瓨錛屼絾鏄痗鍑芥暟鍙互鍦ㄤ換浣曞湴鏂歸鍑猴紝鎵浠ヤ竴鏃︽湁鏌愪釜鍑哄彛澶勬病鏈夐噴鏀懼簲璇ラ噴鏀劇殑鍐呭瓨錛屽氨浼?xì)鍙戠敓鍐呭瓨娉勬紡銆?/span>

銆 銆騫夸箟鐨勮錛屽唴瀛樻硠婕忎笉浠呬粎鍖呭惈鍫嗗唴瀛樼殑娉勬紡錛岃繕鍖呭惈緋葷粺璧勬簮鐨勬硠婕?resource leak)錛屾瘮濡傛牳蹇冩丠ANDLE錛孏DI Object錛孲OCKET錛?Interface絳夛紝浠庢牴鏈笂璇磋繖浜涚敱鎿嶄綔緋葷粺鍒嗛厤鐨勫璞′篃娑堣楀唴瀛橈紝濡傛灉榪欎簺瀵硅薄鍙戠敓娉勬紡鏈緇堜篃浼?xì)瀵艰嚧鍐呭瓨鐨勬硠婕忋傝屼笖錛屾煇浜涘璞℃秷鑰楃殑鏄牳蹇冩佸唴 瀛橈紝榪欎簺瀵硅薄涓ラ噸娉勬紡鏃朵細(xì)瀵艱嚧鏁翠釜鎿嶄綔緋葷粺涓嶇ǔ瀹氥傛墍浠ョ浉姣斾箣涓嬶紝緋葷粺璧勬簮鐨勬硠婕忔瘮鍫嗗唴瀛樼殑娉勬紡鏇翠負(fù)涓ラ噸銆?/span>

銆銆GDI Object鐨勬硠婕忔槸涓縐嶅父瑙佺殑璧勬簮娉勬紡錛?/span>

void CMyView::OnPaint( CDC* pDC )
{
銆CBitmap bmp;
銆CBitmap* pOldBmp;
銆bmp.LoadBitmap(IDB_MYBMP);
銆pOldBmp = pDC->SelectObject( &bmp );
銆…
銆if( Something() ){
銆銆return;
銆}
銆pDC->SelectObject( pOldBmp );
銆return;
}

銆銆渚嬩簩

銆 銆褰撳嚱鏁癝omething()榪斿洖闈為浂鐨勬椂鍊欙紝紼嬪簭鍦ㄩ鍑哄墠娌℃湁鎶妏OldBmp閫夊洖pDC涓紝榪欎細(xì)瀵艱嚧pOldBmp鎸囧悜鐨凥BITMAP瀵硅薄鍙戠敓娉?婕忋傝繖涓▼搴忓鏋滈暱鏃墮棿鐨勮繍琛岋紝鍙兘浼?xì)瀵艰嚧鏁翠釜绯痪l熻姳灞忋傝繖縐嶉棶棰樺湪Win9x涓嬫瘮杈冨鏄撴毚闇插嚭鏉ワ紝鍥犱負(fù)Win9x鐨凣DI鍫嗘瘮Win2k鎴朜T鐨勮灝忓緢 澶氥?/span>

銆銆鍐呭瓨娉勬紡鐨勫彂鐢熸柟寮忥細(xì)

銆銆浠ュ彂鐢熺殑鏂瑰紡鏉ュ垎綾伙紝鍐呭瓨娉勬紡鍙互鍒嗕負(fù)4綾伙細(xì)

銆銆1. 甯稿彂鎬у唴瀛樻硠婕忋傚彂鐢熷唴瀛樻硠婕忕殑浠g爜浼?xì)琚娆℃墽琛屽垘图屾瘡娆¤鎵ц鐨勬椂鍊欓兘浼?xì)瀵艰嚧涓鍧楀唴瀛樻硠婕忋傛瘮濡備緥浜岋紝濡傛灉Something()鍑芥暟涓鐩磋繑鍥濼rue錛岄偅涔坧OldBmp鎸囧悜鐨凥BITMAP瀵硅薄鎬繪槸鍙戠敓娉勬紡銆?/span>

銆 銆2. 鍋跺彂鎬у唴瀛樻硠婕忋傚彂鐢熷唴瀛樻硠婕忕殑浠g爜鍙湁鍦ㄦ煇浜涚壒瀹氱幆澧冩垨鎿嶄綔榪囩▼涓嬫墠浼?xì)鍙戠敓銆傛瘮濡備緥浜岋紝濡傛灉Something()鍑芥暟鍙湁鍦ㄧ壒瀹氱幆澧冧笅鎵嶈繑鍥?True錛岄偅涔坧OldBmp鎸囧悜鐨凥BITMAP瀵硅薄騫朵笉鎬繪槸鍙戠敓娉勬紡銆傚父鍙戞у拰鍋跺彂鎬ф槸鐩稿鐨勩傚浜庣壒瀹氱殑鐜錛屽伓鍙戞х殑涔熻灝卞彉鎴愪簡甯稿彂鎬х殑銆傛墍浠?嫻嬭瘯鐜鍜屾祴璇曟柟娉曞媯(gè)嫻嬪唴瀛樻硠婕忚嚦鍏抽噸瑕併?/span>

銆銆3. 涓嬈℃у唴瀛樻硠婕忋傚彂鐢熷唴瀛樻硠婕忕殑浠g爜鍙細(xì)琚墽琛屼竴嬈★紝鎴栬呯敱浜庣畻娉曚笂鐨勭己闄鳳紝瀵艱嚧鎬諱細(xì)鏈変竴鍧椾粎涓斾竴鍧楀唴瀛樺彂鐢熸硠婕忋傛瘮濡傦紝鍦ㄧ被鐨勬瀯閫犲嚱鏁頒腑鍒嗛厤鍐呭瓨錛屽湪鏋?鏋勫嚱鏁頒腑鍗存病鏈夐噴鏀捐鍐呭瓨錛屼絾鏄洜涓鴻繖涓被鏄竴涓猄ingleton錛屾墍浠ュ唴瀛樻硠婕忓彧浼?xì)鍙戠敓涓嬈°傚彟涓涓緥瀛愶細(xì)

char* g_lpszFileName = NULL;

void SetFileName( const char* lpcszFileName )
{
銆if( g_lpszFileName ){
銆銆free( g_lpszFileName );
銆}
銆g_lpszFileName = strdup( lpcszFileName );
}

銆銆渚嬩笁

銆銆濡傛灉紼嬪簭鍦ㄧ粨鏉熺殑鏃跺欐病鏈夐噴鏀緂_lpszFileName鎸囧悜鐨勫瓧絎︿覆錛岄偅涔堬紝鍗充嬌澶氭璋冪敤SetFileName()錛屾諱細(xì)鏈変竴鍧楀唴瀛橈紝鑰屼笖浠呮湁涓鍧楀唴瀛樺彂鐢熸硠婕忋?/span>

銆 銆4. 闅愬紡鍐呭瓨娉勬紡銆傜▼搴忓湪榪愯榪囩▼涓笉鍋滅殑鍒嗛厤鍐呭瓨錛屼絾鏄洿鍒扮粨鏉熺殑鏃跺欐墠閲婃斁鍐呭瓨銆備弗鏍肩殑璇磋繖閲屽茍娌℃湁鍙戠敓鍐呭瓨娉勬紡錛屽洜涓烘渶緇堢▼搴忛噴鏀句簡鎵鏈夌敵璇風(fēng)殑鍐呭瓨銆備絾 鏄浜庝竴涓湇鍔″櫒紼嬪簭錛岄渶瑕佽繍琛屽嚑澶╋紝鍑犲懆鐢氳嚦鍑犱釜鏈堬紝涓嶅強(qiáng)鏃墮噴鏀懼唴瀛樹篃鍙兘瀵艱嚧鏈緇堣楀敖緋葷粺鐨勬墍鏈夊唴瀛樸傛墍浠ワ紝鎴戜滑縐拌繖綾誨唴瀛樻硠婕忎負(fù)闅愬紡鍐呭瓨娉勬紡銆備婦涓 涓緥瀛愶細(xì) 

class Connection
{
銆public:
銆銆Connection( SOCKET s);
銆銆~Connection();
銆銆…
銆private:
銆銆SOCKET _socket;
銆銆…
};

class ConnectionManager
{
銆public:
銆銆ConnectionManager(){}
銆銆~ConnectionManager(){
銆銆銆list::iterator it;
銆銆銆for( it = _connlist.begin(); it != _connlist.end(); ++it ){
銆銆銆銆delete 錛?it錛?
銆銆銆}
銆銆銆_connlist.clear();
銆銆}
銆銆void OnClientConnected( SOCKET s ){
銆銆銆Connection* p = new Connection(s);
銆銆銆_connlist.push_back(p);
銆銆}
銆銆void OnClientDisconnected( Connection* pconn ){
銆銆銆_connlist.remove( pconn );
銆銆銆delete pconn;
銆銆}
銆private:
銆銆list _connlist;
};

銆銆渚嬪洓

銆 銆鍋囪鍦–lient浠嶴erver绔柇寮鍚庯紝Server騫舵病鏈夊懠鍙玂nClientDisconnected()鍑芥暟錛岄偅涔堜唬琛ㄩ偅嬈¤繛鎺ョ殑 Connection瀵硅薄灝變笉浼?xì)琚強(qiáng)鏃剁殑鍒犻櫎锛堝湪Server紼嬪簭閫鍑虹殑鏃跺欙紝鎵鏈塁onnection瀵硅薄浼?xì)鍦–onnectionManager鐨勬瀽 鏋勫嚱鏁伴噷琚垹闄わ級(jí)銆傚綋涓嶆柇鐨勬湁榪炴帴寤虹珛銆佹柇寮鏃墮殣寮忓唴瀛樻硠婕忓氨鍙戠敓浜嗐?/span>

銆銆浠庣敤鎴蜂嬌鐢ㄧ▼搴忕殑瑙掑害鏉ョ湅錛屽唴瀛樻硠婕忔湰韜笉浼?xì)漶旂敓浠涔堝嵄瀹籌紝浣?涓轟竴鑸殑鐢ㄦ埛錛屾牴鏈劅瑙変笉鍒板唴瀛樻硠婕忕殑瀛樺湪銆傜湡姝f湁鍗卞鐨勬槸鍐呭瓨娉勬紡鐨勫爢縐紝榪欎細(xì)鏈緇堟秷鑰楀敖緋葷粺鎵鏈夌殑鍐呭瓨銆備粠榪欎釜瑙掑害鏉ヨ錛屼竴嬈℃у唴瀛樻硠婕忓茍娌℃湁浠涔堝嵄 瀹籌紝鍥犱負(fù)瀹冧笉浼?xì)鍫喛U紝鑰岄殣寮忓唴瀛樻硠婕忓嵄瀹蟲у垯闈炲父澶э紝鍥犱負(fù)杈冧箣浜庡父鍙戞у拰鍋跺彂鎬у唴瀛樻硠婕忓畠鏇撮毦琚嫻嬪埌銆?nbsp;
媯(gè)嫻嬪唴瀛樻硠婕?/strong>

銆銆媯(gè)嫻嬪唴瀛樻硠婕忕殑鍏抽敭鏄鑳芥埅鑾蜂綇瀵瑰垎閰嶅唴瀛樺拰閲婃斁鍐呭瓨鐨勫嚱鏁扮殑璋冪敤銆傛埅鑾蜂綇榪欎袱涓嚱鏁幫紝鎴戜滑灝辮兘璺熻釜姣忎竴 鍧楀唴瀛樼殑鐢熷懡鍛ㄦ湡錛屾瘮濡傦紝姣忓綋鎴愬姛鐨勫垎閰嶄竴鍧楀唴瀛樺悗錛屽氨鎶婂畠鐨勬寚閽堝姞鍏ヤ竴涓叏灞鐨刲ist涓紱姣忓綋閲婃斁涓鍧楀唴瀛橈紝鍐嶆妸瀹冪殑鎸囬拡浠巐ist涓垹闄ゃ傝繖鏍鳳紝褰?紼嬪簭緇撴潫鐨勬椂鍊欙紝list涓墿浣欑殑鎸囬拡灝辨槸鎸囧悜閭d簺娌℃湁琚噴鏀劇殑鍐呭瓨銆傝繖閲屽彧鏄畝鍗曠殑鎻忚堪浜嗘嫻嬪唴瀛樻硠婕忕殑鍩烘湰鍘熺悊錛岃緇嗙殑綆楁硶鍙互鍙傝Steve Maguire鐨?lt;<Writing Solid Code>>銆?/span>

銆銆濡傛灉瑕佹嫻嬪爢鍐呭瓨鐨勬硠婕忥紝閭d箞闇瑕佹埅鑾蜂綇 malloc/realloc/free鍜宯ew/delete灝卞彲浠ヤ簡錛堝叾瀹瀗ew/delete鏈緇堜篃鏄敤malloc/free鐨勶紝鎵浠ュ彧瑕佹埅鑾峰墠 闈竴緇勫嵆鍙級(jí)銆傚浜庡叾浠栫殑娉勬紡錛屽彲浠ラ噰鐢ㄧ被浼肩殑鏂規(guī)硶錛屾埅鑾蜂綇鐩稿簲鐨勫垎閰嶅拰閲婃斁鍑芥暟銆傛瘮濡傦紝瑕佹嫻婤STR鐨勬硠婕忥紝灝遍渶瑕佹埅鑾?SysAllocString/SysFreeString錛涜媯(gè)嫻婬MENU鐨勬硠婕忥紝灝遍渶瑕佹埅鑾稢reateMenu/ DestroyMenu銆傦紙鏈夌殑璧勬簮鐨勫垎閰嶅嚱鏁版湁澶氫釜錛岄噴鏀懼嚱鏁板彧鏈変竴涓紝姣斿錛孲ysAllocStringLen涔熷彲浠ョ敤鏉ュ垎閰岯STR錛岃繖鏃跺氨闇瑕?鎴幏澶氫釜鍒嗛厤鍑芥暟錛?/span>

銆銆鍦╓indows騫沖彴涓嬶紝媯(gè)嫻嬪唴瀛樻硠婕忕殑宸ュ叿甯哥敤鐨勪竴鑸湁涓夌錛孧S C-Runtime Library鍐呭緩鐨勬嫻嬪姛鑳斤紱澶栨寕寮忕殑媯(gè)嫻嬪伐鍏鳳紝璇稿錛孭urify錛孊oundsChecker絳夛紱鍒╃敤Windows NT鑷甫鐨凱erformance Monitor銆傝繖涓夌宸ュ叿鍚勬湁浼樼己鐐癸紝MS C-Runtime Library铏界劧鍔熻兘涓婅緝涔嬪鎸傚紡鐨勫伐鍏瘋寮憋紝浣嗘槸瀹冩槸鍏嶈垂鐨勶紱Performance Monitor铏界劧鏃犳硶鏍囩ず鍑哄彂鐢熼棶棰樼殑浠g爜錛屼絾鏄畠鑳芥嫻嬪嚭闅愬紡鐨勫唴瀛樻硠婕忕殑瀛樺湪錛岃繖鏄叾浠栦袱綾誨伐鍏鋒棤鑳戒負(fù)鍔涚殑鍦版柟銆?/span>

銆銆浠ヤ笅鎴戜滑璇︾粏璁ㄨ榪欎笁縐嶆嫻嬪伐鍏鳳細(xì)

銆銆VC涓嬪唴瀛樻硠婕忕殑媯(gè)嫻嬫柟娉?/span>

銆銆鐢∕FC寮鍙戠殑搴旂敤紼嬪簭錛屽湪DEBUG鐗堟ā寮忎笅緙栬瘧鍚庯紝閮戒細(xì)鑷姩鍔犲叆鍐呭瓨娉勬紡鐨勬嫻嬩唬鐮併傚湪紼嬪簭緇撴潫鍚庯紝濡傛灉鍙戠敓浜嗗唴瀛樻硠婕忥紝鍦―ebug紿楀彛涓細(xì)鏄劇ず鍑烘墍鏈夊彂鐢熸硠婕忕殑鍐呭瓨鍧楃殑淇℃伅錛屼互涓嬩袱琛屾樉紺轟簡涓鍧楄娉勬紡鐨勫唴瀛樺潡鐨勪俊鎭細(xì)

E:/TestMemLeak/TestDlg.cpp(70) : {59} normal block at 0x00881710, 200 bytes long.

Data: <abcdefghijklmnop> 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70

銆 銆絎竴琛屾樉紺鴻鍐呭瓨鍧楃敱TestDlg.cpp鏂囦歡錛岀70琛屼唬鐮佸垎閰嶏紝鍦板潃鍦?x00881710錛屽ぇ灝忎負(fù)200瀛楄妭錛寋59}鏄寚璋冪敤鍐呭瓨鍒嗛厤鍑芥暟鐨?Request Order錛屽叧浜庡畠鐨勮緇嗕俊鎭彲浠ュ弬瑙丮SDN涓璤CrtSetBreakAlloc()鐨勫府鍔┿傜浜岃鏄劇ず璇ュ唴瀛樺潡鍓?6涓瓧鑺傜殑鍐呭錛屽皷鎷彿鍐呮槸浠?ASCII鏂瑰紡鏄劇ず錛屾帴鐫鐨勬槸浠?6榪涘埗鏂瑰紡鏄劇ず銆?/span>

銆銆涓鑸ぇ瀹墮兘璇互涓鴻繖浜涘唴瀛樻硠婕忕殑媯(gè)嫻嬪姛鑳芥槸鐢盡FC鎻愪緵鐨勶紝鍏跺疄涓嶇劧銆侻FC鍙槸 灝佽鍜屽埄鐢ㄤ簡MS C-Runtime Library鐨凞ebug Function銆傞潪MFC紼嬪簭涔熷彲浠ュ埄鐢∕S C-Runtime Library鐨凞ebug Function鍔犲叆鍐呭瓨娉勬紡鐨勬嫻嬪姛鑳姐侻S C-Runtime Library鍦ㄥ疄鐜癿alloc/free錛宻trdup絳夊嚱鏁版椂宸茬粡鍐呭緩浜嗗唴瀛樻硠婕忕殑媯(gè)嫻嬪姛鑳姐?/span>

銆銆娉ㄦ剰瑙傚療涓涓嬬敱MFC Application Wizard鐢熸垚鐨勯」鐩紝鍦ㄦ瘡涓涓猚pp鏂囦歡鐨勫ご閮ㄩ兘鏈夎繖鏍蜂竴孌靛畯瀹氫箟錛?/span>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

銆銆鏈変簡榪欐牱鐨勫畾涔夛紝鍦ㄧ紪璇慏EBUG鐗堟椂錛屽嚭鐜板湪榪欎釜cpp鏂囦歡涓殑鎵鏈塶ew閮借鏇挎崲鎴怐EBUG_NEW浜嗐傞偅涔圖EBUG_NEW鏄粈涔堝憿錛烡EBUG_NEW涔熸槸涓涓畯錛屼互涓嬫憳鑷猘fx.h錛?632琛?/span>

#define DEBUG_NEW new(THIS_FILE, __LINE__)

銆銆鎵浠ュ鏋滄湁榪欐牱涓琛屼唬鐮侊細(xì)

char* p = new char[200];

銆銆緇忚繃瀹忔浛鎹㈠氨鍙樻垚浜嗭細(xì)

char* p = new( THIS_FILE, __LINE__)char[200];

銆銆鏍規(guī)嵁C++鐨勬爣鍑嗭紝瀵逛簬浠ヤ笂鐨刵ew鐨勪嬌鐢ㄦ柟娉曪紝緙栬瘧鍣ㄤ細(xì)鍘繪壘榪欐牱瀹氫箟鐨刼perator new錛?/span>

void* operator new(size_t, LPCSTR, int)

銆銆鎴戜滑鍦╝fxmem.cpp 63琛屾壘鍒頒簡涓涓繖鏍風(fēng)殑operator new 鐨勫疄鐜?/span>

void* AFX_CDECL operator new(size_t nSize, LPCSTR lpszFileName, int nLine)
{
銆return ::operator new(nSize, _NORMAL_BLOCK, lpszFileName, nLine);
}

void* __cdecl operator new(size_t nSize, int nType, LPCSTR lpszFileName, int nLine)
{
銆…
銆pResult = _malloc_dbg(nSize, nType, lpszFileName, nLine);
銆if (pResult != NULL)
銆銆return pResult;
銆…
}

銆 銆絎簩涓猳perator new鍑芥暟姣旇緝闀匡紝涓轟簡綆鍗曟湡闂達(dá)紝鎴戝彧鎽樺綍浜嗛儴鍒嗐傚緢鏄劇劧鏈鍚庣殑鍐呭瓨鍒嗛厤榪樻槸閫氳繃_malloc_dbg鍑芥暟瀹炵幇鐨勶紝榪欎釜鍑芥暟灞炰簬MS C-Runtime Library 鐨凞ebug Function銆傝繖涓嚱鏁頒笉浣嗚姹備紶鍏ュ唴瀛樼殑澶у皬錛屽彟澶栬繕鏈夋枃浠跺悕鍜岃鍙蜂袱涓弬鏁般傛枃浠跺悕鍜岃鍙峰氨鏄敤鏉ヨ褰曟嬈″垎閰嶆槸鐢卞摢涓孌典唬鐮侀犳垚鐨勩傚鏋滆繖鍧楀唴 瀛樺湪紼嬪簭緇撴潫涔嬪墠娌℃湁琚噴鏀撅紝閭d箞榪欎簺淇℃伅灝變細(xì)杈撳嚭鍒癉ebug紿楀彛閲屻?/span>

銆銆榪欓噷欏轟究鎻愪竴涓婽HIS_FILE錛宊_FILE鍜?__LINE__銆俖_FILE__鍜宊_LINE__閮芥槸緙栬瘧鍣ㄥ畾涔夌殑瀹忋傚綋紕板埌__FILE__鏃訛紝緙栬瘧鍣ㄤ細(xì)鎶奯_FILE__鏇挎崲鎴愪竴涓瓧絎︿覆錛岃繖 涓瓧絎︿覆灝辨槸褰撳墠鍦ㄧ紪璇戠殑鏂囦歡鐨勮礬寰勫悕銆傚綋紕板埌__LINE__鏃訛紝緙栬瘧鍣ㄤ細(xì)鎶奯_LINE__鏇挎崲鎴愪竴涓暟瀛楋紝榪欎釜鏁板瓧灝辨槸褰撳墠榪欒浠g爜鐨勮鍙楓傚湪 DEBUG_NEW鐨勫畾涔変腑娌℃湁鐩存帴浣跨敤__FILE__錛岃屾槸鐢ㄤ簡THIS_FILE錛屽叾鐩殑鏄負(fù)浜嗗噺灝忕洰鏍囨枃浠剁殑澶у皬銆傚亣璁懼湪鏌愪釜cpp鏂囦歡涓湁 100澶勪嬌鐢ㄤ簡new錛屽鏋滅洿鎺ヤ嬌鐢╛_FILE__錛岄偅緙栬瘧鍣ㄤ細(xì)浜х敓100涓父閲忓瓧絎︿覆錛岃繖100涓瓧絎︿覆閮芥槸椋?/SPAN>cpp鏂囦歡鐨勮礬寰?鍚嶏紝鏄劇劧鍗佸垎鍐椾綑銆傚鏋滀嬌鐢═HIS_FILE錛岀紪璇戝櫒鍙細(xì)浜х敓涓涓父閲忓瓧絎︿覆錛岄偅100澶刵ew鐨勮皟鐢ㄤ嬌鐢ㄧ殑閮芥槸鎸囧悜甯擱噺瀛楃涓茬殑鎸囬拡銆?/span>

銆 銆鍐嶆瑙傚療涓涓嬬敱MFC Application Wizard鐢熸垚鐨勯」鐩紝鎴戜滑浼?xì)鍙戠幇鍦╟pp鏂囦歡涓彧瀵筺ew鍋氫簡鏄犲皠錛屽鏋滀綘鍦ㄧ▼搴忎腑鐩存帴浣跨敤malloc鍑芥暟鍒嗛厤鍐呭瓨錛岃皟鐢╩alloc鐨勬枃浠跺悕鍜岃 鍙鋒槸涓嶄細(xì)琚褰曚笅鏉ョ殑銆傚鏋滆繖鍧楀唴瀛樺彂鐢熶簡娉勬紡錛孧S C-Runtime Library浠嶇劧鑳芥嫻嬪埌錛屼絾鏄綋杈撳嚭榪欏潡鍐呭瓨鍧楃殑淇℃伅錛屼笉浼?xì)鍖呭惈鍒嗛厤瀹冪殑鐨勬枃錃g鍚嶅拰琛屽彿銆?/span>

銆銆瑕佸湪闈濵FC紼嬪簭涓墦寮鍐呭瓨娉勬紡鐨勬嫻嬪姛鑳介潪甯稿鏄擄紝浣犲彧瑕佸湪紼嬪簭鐨勫叆鍙e鍔犲叆浠ヤ笅鍑犺浠g爜錛?/span>

int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );

tmpFlag |= _CRTDBG_LEAK_CHECK_DF;

_CrtSetDbgFlag( tmpFlag );

銆銆榪欐牱錛屽湪紼嬪簭緇撴潫鐨勬椂鍊欙紝涔熷氨鏄痺inmain錛宮ain鎴杁llmain鍑芥暟榪斿洖涔嬪悗錛屽鏋滆繕鏈夊唴瀛樺潡娌℃湁閲婃斁錛屽畠浠殑淇℃伅浼?xì)琚?/span>鎵撳嵃鍒癉ebug紿楀彛閲屻?/span>

銆銆濡傛灉浣犺瘯鐫鍒涘緩浜嗕竴涓潪MFC搴旂敤紼嬪簭錛岃屼笖鍦ㄧ▼搴忕殑鍏ュ彛澶勫姞鍏ヤ簡浠ヤ笂浠g爜錛屽茍涓旀晠鎰忓湪紼嬪簭涓笉閲婃斁鏌愪簺鍐呭瓨鍧楋紝浣犱細(xì)鍦―ebug紿楀彛閲岀湅鍒頒互涓嬬殑淇℃伅錛?/span>

{47} normal block at 0x00C91C90, 200 bytes long.

Data: < > 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

銆銆鍐呭瓨娉勬紡鐨勭‘媯(gè)嫻嬪埌浜嗭紝浣嗘槸鍜屼笂闈FC紼嬪簭鐨勪緥瀛愮浉姣旓紝緙哄皯浜嗘枃浠跺悕鍜岃鍙楓傚浜庝竴涓瘮杈冨ぇ鐨勭▼搴忥紝娌℃湁榪欎簺淇℃伅錛岃В鍐抽棶棰樺皢鍙樺緱鍗佸垎鍥伴毦銆?/span>

銆銆涓轟簡鑳藉鐭ラ亾娉勬紡鐨勫唴瀛樺潡鏄湪鍝噷鍒嗛厤鐨勶紝浣犻渶瑕佸疄鐜扮被浼糓FC鐨勬槧灝勫姛鑳斤紝鎶妌ew錛宮aolloc絳夊嚱鏁版槧灝勫埌_malloc_dbg鍑芥暟涓娿傝繖閲屾垜涓嶅啀璧樿堪錛屼綘鍙互鍙傝僊FC鐨勬簮浠g爜銆?/span>

銆 銆鐢變簬Debug Function瀹炵幇鍦∕S C-RuntimeLibrary涓紝鎵浠ュ畠鍙兘媯(gè)嫻嬪埌鍫嗗唴瀛樼殑娉勬紡錛岃屼笖鍙檺浜巑alloc錛宺ealloc鎴杝trdup絳夊垎閰嶇殑鍐呭瓨錛岃岄偅浜涚郴緇熻祫 婧愶紝姣斿HANDLE錛孏DI Object錛屾垨鏄笉閫氳繃C-Runtime Library鍒嗛厤鐨勫唴瀛橈紝姣斿VARIANT錛孊STR鐨勬硠婕忥紝瀹冩槸鏃犳硶媯(gè)嫻嬪埌鐨勶紝榪欐槸榪欑媯(gè)嫻嬫硶鐨勪竴涓噸澶х殑灞闄愭с傚彟澶栵紝涓轟簡鑳借褰曞唴瀛樺潡鏄湪鍝噷 鍒嗛厤鐨勶紝婧愪唬鐮佸繀欏葷浉搴旂殑閰嶅悎錛岃繖鍦ㄨ皟璇曚竴浜涜佺殑紼嬪簭闈炲父楹葷儲(chǔ)錛屾瘯绔熶慨鏀規(guī)簮浠g爜涓嶆槸涓浠剁渷蹇冪殑浜嬶紝榪欐槸榪欑媯(gè)嫻嬫硶鐨勫彟涓涓眬闄愭с?/span>

銆銆瀵?浜庡紑鍙戜竴涓ぇ鍨嬬殑紼嬪簭錛孧S C-Runtime Library鎻愪緵鐨勬嫻嬪姛鑳芥槸榪滆繙涓嶅鐨勩傛帴涓嬫潵鎴戜滑灝辯湅鐪嬪鎸傚紡鐨勬嫻嬪伐鍏楓傛垜鐢ㄧ殑姣旇緝澶氱殑鏄疊oundsChecker錛屼竴鍒欏洜涓哄畠鐨勫姛鑳芥瘮杈冨叏 闈紝鏇撮噸瑕佺殑鏄畠鐨勭ǔ瀹氭с傝繖綾誨伐鍏峰鏋滀笉紼沖畾錛屽弽鑰屼細(xì)蹇欓噷娣諱貢銆傚埌搴曟槸鍑鴻嚜榧庨紟澶у悕鐨凬uMega錛屾垜鐢ㄤ笅鏉ュ熀鏈笂娌℃湁浠涔堝ぇ闂銆?/span>
 浣跨敤BoundsChecker媯(gè)嫻嬪唴瀛樻硠婕忥細(xì)

銆銆BoundsChecker閲囩敤涓縐嶈縐頒負(fù) Code Injection鐨勬妧鏈紝鏉ユ埅鑾峰鍒嗛厤鍐呭瓨鍜岄噴鏀懼唴瀛樼殑鍑芥暟鐨勮皟鐢ㄣ傜畝鍗曞湴璇達(dá)紝褰撲綘鐨勭▼搴忓紑濮嬭繍琛屾椂錛孊oundsChecker鐨凞LL琚嚜鍔ㄨ澆鍏ヨ繘 紼嬬殑鍦板潃絀洪棿錛堣繖鍙互閫氳繃system-level鐨凥ook瀹炵幇錛夛紝鐒跺悗瀹冧細(xì)淇敼榪涚▼涓鍐呭瓨鍒嗛厤鍜岄噴鏀劇殑鍑芥暟璋冪敤錛岃榪欎簺璋冪敤棣栧厛杞叆瀹冪殑浠g爜錛岀劧鍚?鍐嶆墽琛屽師鏉ョ殑浠g爜銆侭oundsChecker鍦ㄥ仛榪欎簺鍔ㄤ綔鐨勬椂錛屾棤欏諱慨鏀硅璋冭瘯紼嬪簭鐨勬簮浠g爜鎴栧伐紼嬮厤緗枃浠訛紝榪欎嬌寰椾嬌鐢ㄥ畠闈炲父鐨勭畝渚褲佺洿鎺ャ?/span>

銆銆榪欓噷鎴戜滑浠alloc鍑芥暟涓轟緥錛屾埅鑾峰叾浠栫殑鍑芥暟鏂規(guī)硶涓庢綾諱技銆?/span>

銆銆闇瑕佽鎴幏鐨勫嚱鏁板彲鑳藉湪DLL涓紝涔熷彲鑳藉湪紼嬪簭鐨勪唬鐮侀噷銆傛瘮濡傦紝濡傛灉闈欐佽繛緇揅-Runtime Library錛岄偅涔坢alloc鍑芥暟鐨勪唬鐮佷細(xì)琚繛緇撳埌紼嬪簭閲屻備負(fù)浜嗘埅鑾蜂綇瀵硅繖綾誨嚱鏁扮殑璋冪敤錛孊oundsChecker浼?xì)鍔ㄦ佷慨鏀硅繖浜涘嚱鏁扮殑鎸囦護(hù)銆?/span>

銆銆浠ヤ笅涓ゆ姹囩紪浠g爜錛屼竴孌墊病鏈塀oundsChecker浠嬪叆錛屽彟涓孌靛垯鏈塀oundsChecker鐨勪粙鍏ワ細(xì)

126: _CRTIMP void * __cdecl malloc (
127: size_t nSize
128: )
129: {

00403C10 push ebp
00403C11 mov ebp,esp
130: return _nh_malloc_dbg(nSize, _newmode, _NORMAL_BLOCK, NULL, 0);
00403C13 push 0
00403C15 push 0
00403C17 push 1
00403C19 mov eax,[__newmode (0042376c)]
00403C1E push eax
00403C1F mov ecx,dword ptr [nSize]
00403C22 push ecx
00403C23 call _nh_malloc_dbg (00403c80)
00403C28 add esp,14h
131: }

銆銆浠ヤ笅榪欎竴孌典唬鐮佹湁BoundsChecker浠嬪叆錛?/span>

126: _CRTIMP void * __cdecl malloc (
127: size_t nSize
128: )
129: {

00403C10 jmp 01F41EC8
00403C15 push 0
00403C17 push 1
00403C19 mov eax,[__newmode (0042376c)]
00403C1E push eax
00403C1F mov ecx,dword ptr [nSize]
00403C22 push ecx
00403C23 call _nh_malloc_dbg (00403c80)
00403C28 add esp,14h
131: }

銆 銆褰揃oundsChecker浠嬪叆鍚庯紝鍑芥暟malloc鐨勫墠涓夋潯姹囩紪鎸囦護(hù)琚浛鎹㈡垚涓鏉mp鎸囦護(hù)錛屽師鏉ョ殑涓夋潯鎸囦護(hù)琚惉鍒板湴鍧01F41EC8澶勪簡銆傚綋紼?搴忚繘鍏alloc鍚庡厛jmp鍒?1F41EC8錛屾墽琛屽師鏉ョ殑涓夋潯鎸囦護(hù)錛岀劧鍚庡氨鏄疊oundsChecker鐨勫ぉ涓嬩簡銆傚ぇ鑷翠笂瀹冧細(xì)鍏堣褰曞嚱鏁扮殑榪斿洖鍦板潃 錛堝嚱鏁扮殑榪斿洖鍦板潃鍦╯tack涓婏紝鎵浠ュ緢瀹規(guī)槗淇敼錛夛紝鐒跺悗鎶婅繑鍥炲湴鍧鎸囧悜灞炰簬BoundsChecker鐨勪唬鐮侊紝鎺ョ潃璺沖埌malloc鍑芥暟鍘熸潵鐨勬寚浠わ紝涔?灝辨槸鍦?0403c15鐨勫湴鏂廣傚綋malloc鍑芥暟緇撴潫鐨勬椂鍊欙紝鐢變簬榪斿洖鍦板潃琚慨鏀癸紝瀹冧細(xì)榪斿洖鍒癇oundsChecker鐨勪唬鐮佷腑錛屾鏃?BoundsChecker浼?xì)璁板綍鐢眒alloc鍒嗛厤鐨勫唴瀛樼殑鎸囬拡錛岀劧鍚庡啀璺寵漿鍒板埌鍘熸潵鐨勮繑鍥炲湴鍧鍘匯?/span>

銆銆濡傛灉鍐呭瓨鍒嗛厤/閲婃斁鍑芥暟鍦―LL涓紝BoundsChecker鍒欓噰鐢ㄥ彟涓縐嶆柟娉曟潵鎴幏瀵硅繖浜涘嚱鏁扮殑璋冪敤銆侭oundsChecker閫氳繃淇敼紼嬪簭鐨凞LL Import Table璁﹖able涓殑鍑芥暟鍦板潃鎸囧悜鑷繁鐨勫湴鍧錛屼互杈懼埌鎴幏鐨勭洰鐨勩?/span>

銆 銆鎴幏浣忚繖浜涘垎閰嶅拰閲婃斁鍑芥暟錛孊oundsChecker灝辮兘璁板綍琚垎閰嶇殑鍐呭瓨鎴栬祫婧愮殑鐢熷懡鍛ㄦ湡銆傛帴涓嬫潵鐨勯棶棰樻槸濡備綍涓庢簮浠g爜鐩稿叧錛屼篃灝辨槸璇村綋 BoundsChecker媯(gè)嫻嬪埌鍐呭瓨娉勬紡錛屽畠濡備綍鎶ュ憡榪欏潡鍐呭瓨鍧楁槸鍝浠g爜鍒嗛厤鐨勩傜瓟妗堟槸璋冭瘯淇℃伅錛圖ebug Information錛夈傚綋鎴戜滑緙栬瘧涓涓狣ebug鐗堢殑紼嬪簭鏃訛紝緙栬瘧鍣ㄤ細(xì)鎶婃簮浠g爜鍜屼簩榪涘埗浠g爜涔嬮棿鐨勫搴斿叧緋昏褰曚笅鏉ワ紝鏀懼埌涓涓崟鐙殑鏂囦歡閲?(.pdb)鎴栬呯洿鎺ヨ繛緇撹繘鐩爣紼嬪簭錛岄氳繃鐩存帴璇誨彇璋冭瘯淇℃伅灝辮兘寰楀埌鍒嗛厤鏌愬潡鍐呭瓨鐨勬簮浠g爜鍦ㄥ摢涓枃浠訛紝鍝竴琛屼笂銆備嬌鐢–ode Injection鍜孌ebug Information錛屼嬌BoundsChecker涓嶄絾鑳借褰曞懠鍙垎閰嶅嚱鏁扮殑婧愪唬鐮佺殑浣嶇疆錛岃屼笖榪樿兘璁板綍鍒嗛厤鏃剁殑Call Stack錛屼互鍙?qiáng)Call Stack涓婄殑鍑芥暟鐨勬簮浠g爜浣嶇疆銆傝繖鍦ㄤ嬌鐢ㄥ儚MFC榪欐牱鐨勭被搴撴椂闈炲父鏈夌敤錛屼互涓嬫垜鐢ㄤ竴涓緥瀛愭潵璇存槑錛?/span>


void ShowXItemMenu()
{
銆…
銆CMenu menu;

銆menu.CreatePopupMenu();
銆//add menu items.
銆menu.TrackPropupMenu();
銆…
}

void ShowYItemMenu( )
{
銆…
銆CMenu menu;
銆menu.CreatePopupMenu();
銆//add menu items.
銆menu.TrackPropupMenu();
銆menu.Detach();//this will cause HMENU leak
銆…
}

BOOL CMenu::CreatePopupMenu()
{
銆…
銆hMenu = CreatePopupMenu();
銆…
}

銆 銆褰撹皟鐢⊿howYItemMenu()鏃訛紝鎴戜滑鏁呮剰閫犳垚HMENU鐨勬硠婕忋備絾鏄紝瀵逛簬BoundsChecker鏉ヨ琚硠婕忕殑HMENU鏄湪class CMenu::CreatePopupMenu()涓垎閰嶇殑銆傚亣璁劇殑浣犵殑紼嬪簭鏈夎澶氬湴鏂逛嬌鐢ㄤ簡CMenu鐨凜reatePopupMenu()鍑芥暟錛屽 CMenu::CreatePopupMenu()閫犳垚鐨勶紝浣犱緷鐒舵棤娉曠‘璁ら棶棰樼殑鏍圭粨鍒板簳鍦ㄥ摢閲岋紝鍦⊿howXItemMenu()涓繕鏄湪 ShowYItemMenu()涓紝鎴栬呰繕鏈夊叾瀹冪殑鍦版柟涔熶嬌鐢ㄤ簡CreatePopupMenu()錛熸湁浜咰all Stack鐨勪俊鎭紝闂灝卞鏄撲簡銆侭oundsChecker浼?xì)濡備笅鎶ュ憡娉勬紡鐨凥MENU鐨勪俊鎭細(xì)

Function
File
Line

CMenu::CreatePopupMenu
E:/8168/vc98/mfc/mfc/include/afxwin1.inl
1009

ShowYItemMenu
E:/testmemleak/mytest.cpp
100

銆銆榪欓噷鐪佺暐浜嗗叾浠栫殑鍑芥暟璋冪敤

銆銆濡傛錛屾垜浠緢瀹規(guī)槗鎵懼埌鍙戠敓闂鐨勫嚱鏁版槸ShowYItemMenu()銆傚綋浣跨敤MFC涔嬬被鐨勭被搴撶紪紼嬫椂錛屽ぇ閮ㄥ垎鐨凙PI璋冪敤閮借灝佽鍦ㄧ被搴撶殑class閲岋紝鏈変簡Call Stack淇℃伅錛屾垜浠氨鍙互闈炲父瀹規(guī)槗鐨勮拷韙埌鐪熸鍙戠敓娉勬紡鐨勪唬鐮併?/span>

銆銆璁板綍Call Stack淇℃伅浼?xì)鋴山E嬪簭鐨勮繍琛屽彉寰楅潪甯告參錛屽洜姝ら粯璁ゆ儏鍐典笅BoundsChecker涓嶄細(xì)璁板綍Call Stack淇℃伅銆傚彲浠ユ寜鐓т互涓嬬殑姝ラ鎵撳紑璁板綍Call Stack淇℃伅鐨勯夐」寮鍏籌細(xì)

銆銆1. 鎵撳紑鑿滃崟錛欱oundsChecker|Setting… 

銆銆2. 鍦‥rror Detection欏典腑錛屽湪Error Detection Scheme鐨凩ist涓夋嫨Custom

銆銆3. 鍦–ategory鐨凜ombox涓夋嫨 Pointer and leak error check

銆銆4. 閽╀笂Report Call Stack澶嶉夋

銆銆5. 鐐瑰嚮Ok

銆銆鍩轟簬Code Injection錛孊oundsChecker榪樻彁渚涗簡API Parameter鐨勬牎楠屽姛鑳斤紝memory over run絳夊姛鑳姐傝繖浜涘姛鑳藉浜庣▼搴忕殑寮鍙戦兘闈炲父鏈夌泭銆傜敱浜庤繖浜涘唴瀹逛笉灞炰簬鏈枃鐨勪富棰橈紝鎵浠ヤ笉鍦ㄦ璇﹁堪浜嗐?/span>

銆銆灝界BoundsChecker鐨勫姛鑳藉姝ゅ己澶э紝浣嗘槸闈㈠闅愬紡鍐呭瓨娉勬紡浠嶇劧鏄懼緱鑻嶇櫧鏃犲姏銆傛墍浠ユ帴涓嬫潵鎴戜滑鐪嬬湅濡備綍鐢≒erformance Monitor媯(gè)嫻嬪唴瀛樻硠婕忋?/span>

銆銆浣跨敤Performance Monitor媯(gè)嫻嬪唴瀛樻硠婕?/span>
銆銆NT鐨勫唴鏍稿湪璁捐榪囩▼涓凡緇忓姞鍏ヤ簡緋葷粺鐩戣鍔熻兘錛屾瘮濡?/span>CPU鐨勪嬌鐢ㄧ巼錛屽唴瀛樼殑浣跨敤鎯呭喌錛孖/O鎿嶄綔鐨勯綣佸害絳夐兘浣滀負(fù)涓涓釜Counter錛屽簲鐢ㄧ▼搴忓彲浠ラ氳繃璇誨彇榪欎簺Counter浜嗚В鏁翠釜緋葷粺鐨勬垨鑰呮煇涓繘紼嬬殑榪愯鐘跺喌銆侾erformance Monitor灝辨槸榪欐牱涓涓簲鐢ㄧ▼搴忋?/span>

銆 銆涓轟簡媯(gè)嫻嬪唴瀛樻硠婕忥紝鎴戜滑涓鑸彲浠ョ洃瑙哖rocess瀵硅薄鐨凥andle Count錛孷irutal Bytes 鍜學(xué)orking Set涓変釜Counter銆侶andle Count璁板綍浜嗚繘紼嬪綋鍓嶆墦寮鐨凥ANDLE鐨勪釜鏁幫紝鐩戣榪欎釜Counter鏈夊姪浜庢垜浠彂鐜扮▼搴忔槸鍚︽湁Handle娉勬紡錛沄irtual Bytes璁板綍浜嗚榪涚▼褰撳墠鍦ㄨ櫄鍦板潃絀洪棿涓婁嬌鐢ㄧ殑铏氭嫙鍐呭瓨鐨勫ぇ灝忥紝NT鐨勫唴瀛樺垎閰嶉噰鐢ㄤ簡涓ゆ璧扮殑鏂規(guī)硶錛岄鍏堬紝鍦ㄨ櫄鍦板潃絀洪棿涓婁繚鐣欎竴孌電┖闂達(dá)紝榪欐椂鎿嶄綔緋葷粺騫?娌℃湁鍒嗛厤鐗╃悊鍐呭瓨錛屽彧鏄繚鐣欎簡涓孌靛湴鍧銆傜劧鍚庯紝鍐嶆彁浜よ繖孌電┖闂達(dá)紝榪欐椂鎿嶄綔緋葷粺鎵嶄細(xì)鍒嗛厤鐗╃悊鍐呭瓨銆傛墍浠ワ紝Virtual Bytes涓鑸誨ぇ浜庣▼搴忕殑Working Set銆傜洃瑙哣irutal Bytes鍙互甯姪鎴戜滑鍙戠幇涓浜涚郴緇熷簳灞傜殑闂; Working Set璁板綍浜嗘搷浣滅郴緇熶負(fù)榪涚▼宸叉彁浜ょ殑鍐呭瓨鐨勬婚噺錛岃繖涓煎拰紼嬪簭鐢寵鐨勫唴瀛樻婚噺瀛樺湪瀵嗗垏鐨勫叧緋伙紝濡傛灉紼嬪簭瀛樺湪鍐呭瓨鐨勬硠婕忚繖涓間細(xì)鎸佺畫澧炲姞錛屼絾鏄?Virtual Bytes鍗存槸璺寵穬寮忓鍔犵殑銆?/span>
銆銆鐩戣榪欎簺Counter鍙互璁╂垜浠簡瑙h繘紼嬩嬌鐢ㄥ唴瀛樼殑鎯呭喌錛屽鏋滃彂鐢熶簡娉勬紡錛屽嵆浣挎槸闅?寮忓唴瀛樻硠婕忥紝榪欎簺Counter鐨勫間篃浼?xì)鎸伨l鍔犮備絾鏄紝鎴戜滑鐭ラ亾鏈夐棶棰樺嵈涓嶇煡閬撳摢閲屾湁闂錛屾墍浠ヤ竴鑸嬌鐢≒erformance Monitor鏉ラ獙璇佹槸鍚︽湁鍐呭瓨娉勬紡錛岃屼嬌鐢˙oundsChecker鏉ユ壘鍒板拰瑙e喅銆?/span>
銆銆褰揚(yáng)erformance Monitor鏄劇ず鏈夊唴瀛樻硠婕忥紝鑰孊oundsChecker鍗存棤娉曟嫻嬪埌錛岃繖鏃舵湁涓ょ鍙兘錛氱涓縐嶏紝鍙戠敓浜嗗伓鍙戞у唴瀛樻硠婕忋傝繖鏃朵綘瑕佺‘淇濅嬌鐢?Performance Monitor鍜屼嬌鐢˙oundsChecker鏃訛紝紼嬪簭鐨勮繍琛岀幆澧冨拰鎿嶄綔鏂規(guī)硶鏄竴鑷寸殑銆傜浜岀錛屽彂鐢熶簡闅愬紡鐨勫唴瀛樻硠婕忋傝繖鏃朵綘瑕侀噸鏂板鏌ョ▼搴忕殑璁捐錛岀劧 鍚庝粩緇嗙爺絀禤erformance Monitor璁板綍鐨凜ounter鐨勫肩殑鍙樺寲鍥撅紝鍒嗘瀽鍏朵腑鐨勫彉鍖栧拰紼嬪簭榪愯閫昏緫鐨勫叧緋伙紝鎵懼埌涓浜涘彲鑳界殑鍘熷洜銆傝繖鏄竴涓棝鑻︾殑榪囩▼錛屽厖婊′簡鍋囪銆佺寽鎯熾侀獙 璇併佸け璐ワ紝浣嗚繖涔熸槸涓涓Н绱粡楠岀殑緇濆ソ鏈轟細(xì)銆?/span>
銆銆鎬葷粨
銆銆鍐呭瓨娉勬紡鏄釜澶ц屽鏉傜殑闂錛屽嵆浣挎槸Java鍜?Net榪欐牱鏈?Gabarge Collection鏈哄埗鐨勭幆澧冿紝涔熷瓨鍦ㄧ潃娉勬紡鐨勫彲鑳斤紝姣斿闅愬紡鍐呭瓨娉勬紡銆傜敱浜庣瘒騫呭拰鑳藉姏鐨勯檺鍒訛紝鏈枃鍙兘瀵硅繖涓富棰樺仛涓涓矖嫻呯殑鐮旂┒銆傚叾浠栫殑闂錛屾瘮濡?澶氭ā鍧椾笅鐨勬硠婕忔嫻嬶紝濡備綍鍦ㄧ▼搴忚繍琛屾椂瀵瑰唴瀛樹嬌鐢ㄦ儏鍐佃繘琛屽垎鏋愮瓑絳夛紝閮芥槸鍙互娣卞叆鐮旂┒鐨勯鐩傚鏋滄?zhèn)ㄦ湁浠涔堟兂娉曪紝寤鴻鎴栧彂鐜頒簡鏌愪簺閿欒錛屾榪庡拰鎴戜氦嫻併?/span> 

閼緳 2012-11-06 21:04 鍙戣〃璇勮
]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              亚洲一区三区在线观看| 亚洲美女av黄| 亚洲韩国日本中文字幕| 国产在线欧美| 欧美3dxxxxhd| 欧美成年人视频网站| 国产一级一区二区| 国产毛片精品国产一区二区三区| 国产精品成人一区| 一本色道久久综合亚洲91| 亚洲国产美女精品久久久久∴| 久热精品在线| 亚洲国产日韩欧美在线图片| 亚洲人体一区| 午夜精品成人在线视频| 久久美女性网| 欧美日韩视频在线| 国产女人精品视频| 在线欧美电影| 亚洲香蕉成视频在线观看| 欧美中文字幕视频| 亚洲精品免费电影| 亚洲小说欧美另类社区| 久久九九精品99国产精品| 亚洲福利视频三区| 亚洲综合国产| 欧美激情第三页| 欧美日韩精品免费在线观看视频| 国产精品亚洲产品| 亚洲人成网站在线观看播放| 亚洲制服丝袜在线| 欧美电影美腿模特1979在线看| 99re热这里只有精品免费视频| 午夜日韩激情| 欧美激情中文字幕在线| 国内精品99| 亚洲女性裸体视频| 欧美激情亚洲激情| 欧美一区二区三区视频在线| 欧美欧美在线| 亚洲国产美女久久久久| 久久国内精品自在自线400部| 最新日韩精品| 久久综合给合久久狠狠狠97色69| 国产精品久久久久7777婷婷| 亚洲欧洲一区二区在线播放 | 亚洲精品乱码久久久久久黑人| 亚洲欧美一区二区激情| 欧美激情亚洲精品| 久久久久久久一区| 国产亚洲欧美另类中文| 午夜精品婷婷| 中日韩视频在线观看| 欧美经典一区二区三区| 亚洲欧洲日产国码二区| 久久精品色图| 亚洲欧美综合一区| 国产免费亚洲高清| 欧美一级片在线播放| 一个人看的www久久| 欧美日韩亚洲一区二| 亚洲三级观看| 麻豆成人综合网| 新片速递亚洲合集欧美合集| 欧美午夜不卡在线观看免费 | 一区二区三区四区五区视频| 欧美激情视频一区二区三区不卡| 欧美在线亚洲| 一区二区三区欧美在线观看| 欧美日韩在线播放| 亚洲午夜精品久久久久久app| 亚洲六月丁香色婷婷综合久久| 蜜桃视频一区| 日韩亚洲一区在线播放| 亚洲精品一区在线观看香蕉| 欧美精品一区二区三区很污很色的 | 欧美**人妖| 欧美成人xxx| 99pao成人国产永久免费视频| 亚洲国产电影| 欧美日韩国产高清视频| 亚洲在线一区二区三区| 亚洲欧美三级在线| 伊人成人在线视频| 欧美激情精品久久久久久久变态| 欧美国产综合视频| 亚洲午夜在线| 久久成人av少妇免费| 国产欧美精品日韩精品| 免费美女久久99| 欧美理论电影在线观看| 先锋a资源在线看亚洲| 久久av红桃一区二区小说| 在线免费观看日本欧美| 亚洲国产专区校园欧美| 国产精品久久国产精品99gif | 欧美亚洲视频一区二区| 亚洲欧美在线高清| 国产精品永久免费视频| 嫩草成人www欧美| 欧美性猛交一区二区三区精品| 久久精品国产久精国产思思| 久久综合久久美利坚合众国| 亚洲午夜精品网| 久久久噜噜噜久久中文字免| 亚洲午夜久久久久久尤物| 久久se精品一区二区| 夜夜嗨一区二区三区| 久久成年人视频| 亚洲欧美国产不卡| 欧美成ee人免费视频| 欧美专区在线观看一区| 欧美国产日韩在线观看| 久久爱91午夜羞羞| 欧美日韩亚洲国产精品| 欧美黄色免费网站| 国内精品99| 亚洲欧美中文日韩在线| 欧美视频导航| 影音先锋在线一区| 亚洲女ⅴideoshd黑人| 亚洲精品乱码| 久热国产精品| 久久免费午夜影院| 午夜欧美精品| 亚洲欧美综合v| 欧美午夜久久| 亚洲精品一区二区网址 | 国产在线视频欧美| 亚洲视频1区| 中文精品视频| 欧美人牲a欧美精品| 亚洲国产精品嫩草影院| 在线播放豆国产99亚洲| 久久国产88| 久久视频国产精品免费视频在线| 国产日韩综合| 久久精品99| 欧美插天视频在线播放| 在线观看视频一区二区| 麻豆91精品| 亚洲国产精品一区二区久| 亚洲精品久久7777| 欧美日韩国产综合网| 夜夜嗨一区二区三区| 亚洲欧洲av一区二区| 国产欧美日本| 久久久久综合网| 亚洲国产美国国产综合一区二区| 亚洲精品亚洲人成人网| 欧美日韩八区| 亚洲自拍三区| 欧美va天堂在线| 一本色道久久综合亚洲精品按摩| 欧美日本在线视频| 一区二区三区福利| 久久精品欧洲| 亚洲狠狠丁香婷婷综合久久久| 欧美激情综合在线| 亚洲在线日韩| 欧美成年人网| 一本色道久久综合精品竹菊| 欧美国产日韩亚洲一区| 在线一区观看| 麻豆av一区二区三区| 欧美成人一区二区三区在线观看 | 午夜天堂精品久久久久| 国产噜噜噜噜噜久久久久久久久| 久久精品国产精品 | 日韩一区二区福利| 欧美亚洲网站| 在线观看欧美亚洲| 欧美精品大片| 亚洲电影有码| 午夜日韩激情| 国模精品一区二区三区色天香| 久久精品免费播放| 乱人伦精品视频在线观看| 亚洲资源av| 国产女人aaa级久久久级| 欧美亚洲在线播放| 亚洲欧美一级二级三级| 亚洲国产成人午夜在线一区| 欧美日韩色一区| 先锋影音一区二区三区| 亚洲国产精品va在线看黑人| 欧美婷婷久久| 久久精品国产免费看久久精品| 欧美激情影音先锋| 国产日韩欧美在线视频观看| 欧美日韩国产欧| 久久精品人人爽| 日韩亚洲在线观看| 亚洲福利视频在线| 久久国产精品久久w女人spa| 亚洲狠狠婷婷| 国内精品久久久久久久影视蜜臀 | 一区二区精品在线| 国产精品日韩欧美一区二区| 免费在线观看一区二区|