锘??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲成人在线观看视频,亚洲免费一区二区,国产精品推荐精品http://m.shnenglu.com/API/category/16121.htmlzh-cnFri, 31 Jul 2015 23:42:59 GMTFri, 31 Jul 2015 23:42:59 GMT60寮傚父鍜屽紓甯稿鐞嗭紙windows騫沖彴錛?/title><link>http://m.shnenglu.com/API/archive/2014/11/26/208965.html</link><dc:creator>C++鎶鏈腑蹇?/dc:creator><author>C++鎶鏈腑蹇?/author><pubDate>Wed, 26 Nov 2014 07:12:00 GMT</pubDate><guid>http://m.shnenglu.com/API/archive/2014/11/26/208965.html</guid><wfw:comment>http://m.shnenglu.com/API/comments/208965.html</wfw:comment><comments>http://m.shnenglu.com/API/archive/2014/11/26/208965.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/API/comments/commentRss/208965.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/API/services/trackbacks/208965.html</trackback:ping><description><![CDATA[<div>銆愮炕璇戙戝紓甯稿拰寮傚父澶勭悊錛坵indows騫沖彴錛?/div><div>緲昏瘧鐨勪笉濂斤紝鑾?/div><div>鍘熸枃鍦板潃錛?http://crashrpt.sourceforge.net/docs/html/exception_handling.html#getting_exception_context</div><div>About Exceptions and Exception Handling</div><div></div><div>About Exception</div><div></div><div>褰撶▼搴忛亣鍒頒竴涓紓甯告垨涓涓弗閲嶇殑閿欒鏃訛紝閫氬父鎰忓懗鐫瀹冧笉鑳界戶緇甯歌繍琛屽茍涓旈渶瑕佸仠姝㈡墽琛屻?/div><div>渚嬪錛屽綋閬囧埌涓嬪垪鎯呭喌鏃訛紝紼嬪簭浼氬嚭鐜板紓甯革細</div><div>  紼嬪簭璁塊棶涓涓笉鍙敤鐨勫唴瀛樺湴鍧錛堜緥濡傦紝NULL鎸囬拡錛夛紱</div><div>l 鏃犻檺閫掑綊瀵艱嚧鐨勬爤婧㈠嚭錛?/div><div>l 鍚戜竴涓緝灝忕殑緙撳啿鍖哄啓鍏ヨ緝澶у潡鐨勬暟鎹紱</div><div>l 綾葷殑綰櫄鍑芥暟琚皟鐢紱</div><div>l 鐢寵鍐呭瓨澶辮觸錛堝唴瀛樼┖闂翠笉瓚籌級錛?/div><div>l 涓涓潪娉曠殑鍙傛暟琚紶閫掔粰C++鍑芥暟錛?/div><div>l C榪愯鏃跺簱媯嫻嬪埌涓涓敊璇茍涓旈渶瑕佺▼搴忕粓姝㈡墽琛屻?/div><div> </div><div>鏈変袱縐嶄笉鍚屾ц川鐨勫紓甯革細緇撴瀯鍖栧紓甯?Structured Exception Handling, SEH)鍜岀被鍨嬪寲鐨凜++寮傚父銆?/div><div>SEH鏄負C璇█璁捐鐨勶紝浣嗘槸浠栦滑涔熻兘澶熻鐢ㄤ簬C++銆係EH寮傚父鐢盻_try{}__except(){}緇撴瀯鏉ュ鐞嗐係EH鏄疺C++緙栬瘧鍣ㄧ壒鏈夌殑錛屽洜姝ゅ鏋滀綘鎯寵緙栧啓鍙Щ妞嶇殑浠g爜錛屽氨涓嶅簲褰撲嬌鐢⊿EH銆?/div><div>C++涓被鍨嬪寲鐨勫紓甯告槸鐢眛ry{}catch(){}緇撴瀯澶勭悊鐨勩備緥濡傦紙渚嬪瓙鏉ヨ嚜榪欓噷http://www.cplusplus.com/doc/tutorial/exceptions/錛夛細</div><div></div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> #include <iostream><br /> <span style="color: #0000FF; ">using</span> <span style="color: #0000FF; ">namespace</span> std;<br />  <br /> <span style="color: #0000FF; ">int</span> main(){<br />     <span style="color: #0000FF; ">try</span>{<br />        <span style="color: #0000FF; ">throw</span> 20;<br />     }<br />     <span style="color: #0000FF; ">catch</span> (<span style="color: #0000FF; ">int</span> e){<br />        cout << "An exception occrred. Exception Nr. " << e << endl;<br />     }<br />  <br />     <span style="color: #0000FF; ">return</span> 0;<br /> }</div></div><div> </div><div>緇撴瀯鍖栧紓甯稿鐞?/div><div></div><div>褰撳彂鐢熶竴涓猄EH寮傚父鏃訛紝浣犻氬父浼氱湅鍒頒竴涓剰鍥懼悜寰蔣鍙戦侀敊璇姤鍛婄殑寮瑰嚭紿楀彛銆?/div><div>浣犲彲浠ヤ嬌鐢≧aiseException()鍑芥暟鑷繁浜х敓涓涓猄EH寮傚父銆?/div><div>浣犲彲浠ュ湪浣犵殑浠g爜涓嬌鐢╛_try{}__except(Expression){}緇撴瀯鏉ユ崟鑾稴EH寮傚父銆傜▼搴忎腑鐨刴ain()鍑芥暟琚繖鏍風殑緇撴瀯淇濇姢錛屽洜姝ら粯璁ゅ湴錛屾墍鏈夋湭琚鐞嗙殑SEH寮傚父閮戒細琚崟鑾楓?/div><div>渚嬪錛?/div><div></div><div> <span style="background-color: #eeeeee; font-size: 13px;">#include </span><span style="background-color: #eeeeee; font-size: 13px;"><</span><span style="background-color: #eeeeee; font-size: 13px;">Windows.h</span><span style="background-color: #eeeeee; font-size: 13px;">></span></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all">  <br /> <span style="color: #0000FF; ">int</span> main(){<br />     <span style="color: #0000FF; ">int</span> *p = NULL;  <span style="color: #008000; ">//</span><span style="color: #008000; "> pointer to NULL</span><span style="color: #008000; "><br /></span>     __try{<br />        <span style="color: #008000; ">//</span><span style="color: #008000; "> Guarded code</span><span style="color: #008000; "><br /></span>        *p = 13;    <span style="color: #008000; ">//</span><span style="color: #008000; "> causes an access violation exception;</span><span style="color: #008000; "><br /></span>     }<br />     __except(EXCEPTION_EXECUTE_HANDLER){  <span style="color: #008000; ">//</span><span style="color: #008000; "> Here is exception filter expression<br />        </span><span style="color: #008000; ">//</span><span style="color: #008000; "> Here is exception handler<br />        </span><span style="color: #008000; ">//</span><span style="color: #008000; "> Terminate program</span><span style="color: #008000; "><br /></span>        ExitProcess(1);<br />     }<br />  <br />     <span style="color: #0000FF; ">return</span> 0;<br /> }</div><div></div><div> </div><div> </div><div>姣忎竴涓猄EH寮傚父閮芥湁涓涓笌鍏剁浉鍏寵仈鐨勫紓甯哥爜錛坋xception code錛夈備綘鍙互浣跨敤GetExceptionCode()鍑芥暟鏉ヨ幏鍙栧紓甯哥爜銆備綘鍙互閫氳繃GetExceptionInformation()鏉ヨ幏鍙栧紓甯鎬俊鎭備負浜嗕嬌鐢ㄨ繖浜涘嚱鏁幫紝浣犻氬父浼氬儚涓嬮潰紺轟緥涓竴鏍峰畾鍒惰嚜宸辯殑exception filter銆?/div><div>涓嬮潰鐨勪緥瀛愯鏄庝簡濡備綍浣跨敤SEH exception filter銆?/div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><br /> <span style="color: #0000FF; ">int</span> seh_filter(unsigned <span style="color: #0000FF; ">int</span> code, <span style="color: #0000FF; ">struct</span> _EXCEPTION_POINTERS *ep){<br />     <span style="color: #008000; ">//</span><span style="color: #008000; "> Generate error report<br />     </span><span style="color: #008000; ">//</span><span style="color: #008000; "> Execute exception handler</span><span style="color: #008000; "><br /></span>     <span style="color: #0000FF; ">return</span> EXCEPTION_EXECUTE_HANDLER;<br /> }<br />  <br /> <span style="color: #0000FF; ">int</span> main(){<br />     __try{<br />        <span style="color: #008000; ">//</span><span style="color: #008000; "> .. some buggy code here</span><span style="color: #008000; "><br /></span>     }<br />     __except(seh_filter(GetExceptionCode(), GetExceptionInformation())){<br />        <span style="color: #008000; ">//</span><span style="color: #008000; "> Terminate program</span><span style="color: #008000; "><br /></span>        ExitProcess(1);<br />     }<br />  <br />     <span style="color: #0000FF; ">return</span> 0;<br /> }</div></div><div></div><div> </div><div> </div><div>__try{}__exception(){}緇撴瀯鏄潰鍚慍璇█鐨勶紝浣嗘槸錛屼綘鍙互灝嗕竴涓猄EH寮傚父閲嶅畾鍚戝埌C++寮傚父錛屽茍涓斾綘鍙互鍍忓鐞咰++寮傚父涓鏍峰鐞嗗畠銆傛垜浠彲浠ヤ嬌鐢–++榪愯鏃跺簱涓殑_set_se_translator()鍑芥暟鏉ュ疄鐜般?/div><div>鐪嬩竴涓狹SDN涓殑渚嬪瓙錛堣瘧鑰呮敞錛氳繍琛屾渚嬪瓙闇鎵撳紑/EHa緙栬瘧閫夐」錛夛細</div><div></div><div> <span style="background-color: #eeeeee; font-size: 13px;">  #include </span><span style="background-color: #eeeeee; font-size: 13px;"><</span><span style="background-color: #eeeeee; font-size: 13px;">cstdio</span><span style="background-color: #eeeeee; font-size: 13px;">></span></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all">   #include <windows.h><br />   #include <eh.h><br />    <br />   <span style="color: #0000FF; ">void</span> SEFunc();<br />   <span style="color: #0000FF; ">void</span> trans_func(unsigned <span style="color: #0000FF; ">int</span>, EXCEPTION_POINTERS *);<br />    <br />   <span style="color: #0000FF; ">class</span> SE_Exception{<br />   <span style="color: #0000FF; ">private</span>:<br />       unsigned <span style="color: #0000FF; ">int</span> nSE;<br />   <span style="color: #0000FF; ">public</span>:<br />       SE_Exception(){}<br />       SE_Exception(unsigned <span style="color: #0000FF; ">int</span> n) : nSE(n){}<br />       ~SE_Exception() {}<br />       unsigned <span style="color: #0000FF; ">int</span> getSeNumber(){ <span style="color: #0000FF; ">return</span> nSE; }<br />   };<br />    <br />   <span style="color: #0000FF; ">int</span> main(<span style="color: #0000FF; ">void</span>){<br />       <span style="color: #0000FF; ">try</span>{<br />          _set_se_translator(trans_func);<br />          SEFunc();<br />       }<br />       <span style="color: #0000FF; ">catch</span>(SE_Exception e){<br />          printf("Caught a __try exception with SE_Exception.\n");<br />       }<br />   }<br />    <br />   <span style="color: #0000FF; ">void</span> SEFunc(){<br />       __try{<br />          <span style="color: #0000FF; ">int</span> x, y=0;<br />          x = 5 / y;<br />       }<br />       __finally{<br />          printf("In finally\n");<br />       }<br />   }<br />    <br />   <span style="color: #0000FF; ">void</span> trans_func(unsigned <span style="color: #0000FF; ">int</span> u, EXCEPTION_POINTERS* pExp){<br />       printf("In trans_func.\n");<br />       <span style="color: #0000FF; ">throw</span> SE_Exception();<br />   }</div><div></div><div> </div><div> </div><div>浣犲彲鑳藉繕璁板涓浜涙綔鍦ㄧ殑閿欒浠g爜浣跨敤__try{}__catch(Expression){}緇撴瀯榪涜淇濇姢錛岃岃繖浜涗唬鐮佸彲鑳戒細浜х敓寮傚父錛屼絾鏄繖涓紓甯稿嵈娌℃湁琚綘鐨勭▼搴忔墍澶勭悊銆備笉鐢ㄦ媴蹇冿紝榪欎釜鏈澶勭悊鐨凷EH寮傚父鑳藉琚玼nhandled Exception filter鎵鎹曡幏錛屾垜浠彲浠ヤ嬌鐢⊿etUnhandledExceptionFilter()鍑芥暟璁劇疆top-levelunhandled exception filter銆?/div><div>寮傚父淇℃伅錛堝紓甯稿彂鐢熸椂鐨凜PU鐘舵侊級閫氳繃EXCEPTION_POINTERS琚紶閫掔粰exception handler銆?/div><div>渚嬪錛?/div><div></div><div> <span style="background-color: #eeeeee; font-size: 13px;">  </span><span style="font-size: 13px; color: #008000;">//</span><span style="font-size: 13px; color: #008000;"> crt_settrans.cpp</span></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><span style="color: #008000; ">   </span><span style="color: #008000; ">//</span><span style="color: #008000; "> compile with: /EHa</span><span style="color: #008000; "><br /></span>   LONG WINAPI MyUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionPtrs){<br />       <span style="color: #008000; ">//</span><span style="color: #008000; "> Do something, for example generate error report<br />       </span><span style="color: #008000; ">//</span><span style="color: #008000; ">..<br />       </span><span style="color: #008000; ">//</span><span style="color: #008000; "> Execute default exception handler next</span><span style="color: #008000; "><br /></span>       <span style="color: #0000FF; ">return</span> EXCEPTION_EXECUTE_HANDLER;<br />   }<br />    <br />   <span style="color: #0000FF; ">void</span> main(){<br />       SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);<br />       <span style="color: #008000; ">//</span><span style="color: #008000; "> .. some unsafe code here</span><span style="color: #008000; "><br /></span>   }</div><div></div><div> </div><div> </div><div>top-level SEH exception handler瀵硅繘紼嬩腑鐨勬瘡涓嚎紼嬮兘璧蜂綔鐢紝鍥犳鍦ㄤ綘鐨刴ain()鍑芥暟寮澶磋皟鐢ㄤ竴嬈″氨澶熶簡銆?/div><div>top-level SEH exception handler鍦ㄥ彂鐢熷紓甯哥殑綰跨▼鐨勪笂涓嬫枃涓璋冪敤銆傝繖浼氬獎鍝嶅紓甯稿鐞嗗嚱鏁頒粠寮傚父涓仮澶嶇殑鑳藉姏銆?/div><div>濡傛灉浣犵殑寮傚父澶勭悊鍑芥暟浣嶄簬涓涓狣LL涓紝閭d箞鍦ㄤ嬌鐢⊿etUnhandledExceptionFilter()鍑芥暟鏃跺氨瑕佸皬蹇冧簡銆傚鏋滀綘鐨勫嚱鏁板湪紼嬪簭宕╂簝鏃惰繕鏈鍔犺澆錛岃繖縐嶈涓烘槸涓嶅彲棰勬祴鐨勩?/div><div>鍚戦噺鍖栧紓甯稿鐞嗭紙Vectored Exception Handling錛?/div><div></div><div>鍚戦噺鍖栧紓甯稿鐞?VEH)鏄粨鏋勫寲寮傚父澶勭悊鐨勪竴涓墿灞曪紝瀹冨湪Windows XP涓寮曞叆銆?/div><div>浣犲彲浠ヤ嬌鐢ˋddVectoredExceptionHandler()鍑芥暟娣誨姞涓涓悜閲忓寲寮傚父澶勭悊鍣紝VEH鐨勭己鐐規槸瀹冨彧鑳界敤鍦╓inXP鍙婂叾浠ュ悗鐨勭増鏈紝鍥犳闇瑕佸湪榪愯鏃舵鏌ddVectoredExceptionHandler()鍑芥暟鏄惁瀛樺湪銆?/div><div>瑕佺Щ闄ゅ厛鍓嶅畨瑁呯殑寮傚父澶勭悊鍣紝鍙互浣跨敤RemoveVectoredExceptionHandler()鍑芥暟銆?/div><div>VEH鍏佽鏌ョ湅鎴栧鐞嗗簲鐢ㄧ▼搴忎腑鎵鏈夌殑寮傚父銆備負浜嗕繚鎸佸悗鍚戝吋瀹癸紝褰撶▼搴忎腑鐨勬煇浜涢儴鍒嗗彂鐢烻EH寮傚父鏃訛紝緋葷粺渚濇璋冪敤宸插畨瑁呯殑VEH澶勭悊鍣紝鐩村埌瀹冩壘鍒版湁鐢ㄧ殑SEH澶勭悊鍣ㄣ?/div><div>VEH鐨勪竴涓紭鐐規槸鑳藉閾炬帴寮傚父澶勭悊鍣?chain exception handlers)錛屽洜姝ゅ鏋滄湁浜哄湪浣犱箣鍓嶅畨瑁呬簡鍚戦噺鍖栧紓甯稿鐞嗗櫒錛屼綘浠嶇劧鑳芥埅鑾瘋繖浜涘紓甯搞?/div><div>褰撲綘闇瑕佸儚璋冭瘯鍣ㄤ竴鏍風洃浜嬫墍鏈夌殑寮傚父鏃訛紝浣跨敤VEH鏄緢鍚堥傜殑銆傞棶棰樻槸浣犻渶瑕佸喅瀹氬摢涓紓甯擱渶瑕佸鐞嗭紝鍝釜寮傚父闇瑕佽煩榪囥?In program's code, some exceptions may be intentionally guarded by __try{}__except(){} construction, and handling such exceptions in VEH and not passing it to frame-based SEH handler, you may introduce bugs into application logics.</div><div>VEH鐩墠娌℃湁琚獵rashRpt鎵浣跨敤銆係etUnhandledExceptionFilter()鏇村姞閫傜敤錛屽洜涓哄畠鏄痶op-level SEH澶勭悊鍣ㄣ傚鏋滄病鏈変漢澶勭悊寮傚父錛宼op-level SEH澶勭悊鍣ㄥ氨浼氳璋冪敤錛屽茍涓斾綘涓嶇敤鍐沖畾鏄惁瑕佸鐞嗚繖涓紓甯搞?/div><div>CRT 閿欒澶勭悊</div><div></div><div>闄や簡SEH寮傚父鍜孋++綾誨瀷鍖栧紓甯革紝C榪愯搴?C runtime libraries, CRT)涔熸彁渚涘畠鑷繁鐨勯敊璇鐞嗘満鍒訛紝鍦ㄤ綘鐨勭▼搴忎腑涔熷簲璇ヨ冭檻浣跨敤瀹冦?/div><div>褰揅RT閬囧埌涓涓湭琚鐞嗙殑C++綾誨瀷鍖栧紓甯告椂錛屽畠浼氳皟鐢╰erminate()鍑芥暟銆傚鏋滀綘鎯蟲嫤鎴繖涓皟鐢ㄥ茍鎻愪緵鍚堥傜殑琛屼負錛屼綘搴旇浣跨敤set_terminate()鍑芥暟璁劇疆閿欒澶勭悊鍣?error hanlder)銆備緥濡傦細</div><div></div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->   #include <iostream><br />   <span style="color: #0000FF; ">void</span> my_terminate_handler()<br />   {<br />       <span style="color: #008000; ">//</span><span style="color: #008000; "> Abnormal program termination (terminate() function was called)<br />       </span><span style="color: #008000; ">//</span><span style="color: #008000; "> Do something here<br />       </span><span style="color: #008000; ">//</span><span style="color: #008000; "> Finally, terminate program</span><span style="color: #008000; "><br /></span>       std::cout << "terminate.\n";<br />       exit(1);<br />   }<br />    <br />   <span style="color: #0000FF; ">int</span> main()<br />   {<br />       set_terminate(my_terminate_handler);<br />    <br />       terminate();<br />    <br />       <span style="color: #0000FF; ">return</span> 0;<br />   }</div></div><div></div><div> </div><div> </div><div>Note錛氬湪澶氱嚎紼嬬幆澧冧腑錛屾瘡涓嚎紼嬬淮鎶ゅ悇鑷殑unexpected鍜宼erminate鍑芥暟銆傛瘡涓柊綰跨▼闇瑕佸畨瑁呰嚜宸辯殑unexpected鍜宼erminate鍑芥暟銆傚洜姝わ紝姣忎釜綰跨▼璐熻矗鑷繁鐨剈nexpected鍜宼erminate澶勭悊鍣ㄣ?/div><div> </div><div>浣跨敤_set_purecall_handler()鍑芥暟鏉ュ鐞嗙函铏氬嚱鏁拌皟鐢ㄣ傝繖涓嚱鏁板彲浠ョ敤浜嶸C++2003鍙婂叾鍚庣畫鐗堟湰銆傝繖涓嚱鏁板彲浠ョ敤浜庝竴涓繘紼嬩腑鐨勬墍鏈夌嚎紼嬨備緥濡傦紙鏉ユ簮浜嶮SDN錛夛細</div><div></div><div>  <span style="background-color: #eeeeee; font-size: 13px;"> </span><span style="font-size: 13px; color: #008000;">//</span><span style="font-size: 13px; color: #008000;"> compile with: /EHa</span></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><span style="color: #008000; ">   </span><span style="color: #008000; ">//</span><span style="color: #008000; "> _set_purecall_handler.cpp<br />   </span><span style="color: #008000; ">//</span><span style="color: #008000; "> compile with: /W1</span><span style="color: #008000; "><br /></span>   #include <tchar.h><br />   #include <stdio.h><br />   #include <stdlib.h><br />    <br />   <span style="color: #0000FF; ">class</span> CDerived;<br />   <span style="color: #0000FF; ">class</span> CBase{<br />   <span style="color: #0000FF; ">public</span>:<br />       CBase(CDerived *derived): m_pDerived(derived) {};<br />       ~CBase();<br />       <span style="color: #0000FF; ">virtual</span> <span style="color: #0000FF; ">void</span> function(<span style="color: #0000FF; ">void</span>) = 0;<br />    <br />       CDerived * m_pDerived;<br />   };<br />    <br />   <span style="color: #0000FF; ">class</span> CDerived : <span style="color: #0000FF; ">public</span> CBase{<br />   <span style="color: #0000FF; ">public</span>:<br />       CDerived() : CBase(<span style="color: #0000FF; ">this</span>) {};   <span style="color: #008000; ">//</span><span style="color: #008000; "> C4355</span><span style="color: #008000; "><br /></span>       <span style="color: #0000FF; ">virtual</span> <span style="color: #0000FF; ">void</span> function(<span style="color: #0000FF; ">void</span>) {};<br />   };<br />    <br />   CBase::~CBase(){<br />       m_pDerived -> function();<br />   }<br />    <br />   <span style="color: #0000FF; ">void</span> myPurecallHandler(<span style="color: #0000FF; ">void</span>){<br />       printf("In _purecall_handler.");<br />       exit(0);<br />   }<br />    <br />   <span style="color: #0000FF; ">int</span> _tmain(<span style="color: #0000FF; ">int</span> argc, _TCHAR* argv[]){<br />       <span style="color: #008000; ">//</span><span style="color: #008000; ">_set_purecall_handler(myPurecallHandler);</span><span style="color: #008000; "><br /></span>       CDerived myDerived;<br />   }</div><div></div><div> </div><div> </div><div>浣跨敤_set_new_handler()鍑芥暟澶勭悊鍐呭瓨鍒嗛厤澶辮觸銆傝繖涓嚱鏁拌兘澶熺敤浜嶸C++2003鍙婂叾鍚庣畫鐗堟湰銆傝繖涓嚱鏁板彲浠ョ敤浜庝竴涓繘紼嬩腑鐨勬墍鏈夌嚎紼嬨備篃鍙互鑰冭檻浣跨敤_set_new_mode()鍑芥暟鏉ヤ負malloc()鍑芥暟瀹氫箟閿欒鏃剁殑琛屼負銆備緥濡傦紙鏉ヨ嚜MSDN錛夛細</div><div></div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->  <span style="color: #008000; ">//</span><span style="color: #008000; "> crt_settrans.cpp</span><span style="color: #008000; "><br /></span>  #include <<span style="color: #0000FF; ">new</span>.h><br />  <span style="color: #0000FF; ">int</span> handle_program_memory_depletion( size_t ){<br />      <span style="color: #008000; ">//</span><span style="color: #008000; "> Your code</span><span style="color: #008000; "><br /></span>  }<br />  <span style="color: #0000FF; ">int</span> main( <span style="color: #0000FF; ">void</span> ){<br />      _set_new_handler( handle_program_memory_depletion );<br />      <span style="color: #0000FF; ">int</span> *pi = <span style="color: #0000FF; ">new</span> <span style="color: #0000FF; ">int</span>[BIG_NUMBER];<br />  }</div></div><div></div><div> </div><div> </div><div>鍦╒C++2003涓紝浣犺兘澶熶嬌鐢╛set_security_error_handler()鍑芥暟鏉ュ鐞嗙紦鍐插尯婧㈠嚭閿欒銆傝繖涓嚱鏁板凡緇忚搴熷純錛屽茍涓斾粠涔嬪悗VC++鐗堟湰鐨凜RT涓Щ闄ゃ?/div><div>褰撶郴緇熷嚱鏁拌皟鐢ㄦ嫻嬪埌闈炴硶鐨勫弬鏁版椂錛屼細浣跨敤_set_invalid_parameter_handler()鍑芥暟鏉ュ鐞嗚繖縐嶆儏鍐點傝繖涓嚱鏁拌兘澶熺敤浜嶸C++2005鍙婂叾浠ュ悗鐨勭増鏈傝繖涓嚱鏁板彲鐢ㄤ簬榪涚▼涓殑鎵鏈夌嚎紼嬨?/div><div>渚嬪瓙錛堟潵婧愪簬MSDN錛夛細</div><div></div><div>  <span style="background-color: #eeeeee; font-size: 13px;"> </span><span style="font-size: 13px; color: #008000;">//</span><span style="font-size: 13px; color: #008000;"> compile with: /Zi /MTd</span></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all">   #include <stdio.h><br />   #include <stdlib.h><br />   #include <crtdbg.h>  <span style="color: #008000; ">//</span><span style="color: #008000; "> For _CrtSetReportMode</span><span style="color: #008000; "><br /></span>    <br />   <span style="color: #0000FF; ">void</span> myInvalidParameterHandler(<span style="color: #0000FF; ">const</span> wchar_t* expression,<br />                               <span style="color: #0000FF; ">const</span> wchar_t* function,<br />                               <span style="color: #0000FF; ">const</span> wchar_t* file,<br />                               unsigned <span style="color: #0000FF; ">int</span> line,<br />                               uintptr_t pReserved){<br />       wprintf(L"Invalid parameter detected in function %s."<br />          L" File: %s Line: %d\n", function, file, line);<br />       wprintf(L"Expression: %s\n", expression);<br />   }<br />    <br />    <br />   <span style="color: #0000FF; ">int</span> main( ){<br />       <span style="color: #0000FF; ">char</span>* formatString;<br />    <br />       _invalid_parameter_handler oldHandler, newHandler;<br />       newHandler = myInvalidParameterHandler;<br />       oldHandler = _set_invalid_parameter_handler(newHandler);<br />    <br />       <span style="color: #008000; ">//</span><span style="color: #008000; "> Disable the message box for assertions.</span><span style="color: #008000; "><br /></span>       _CrtSetReportMode(_CRT_ASSERT, 0);<br />    <br />       <span style="color: #008000; ">//</span><span style="color: #008000; "> Call printf_s with invalid parameters.</span><span style="color: #008000; "><br /></span>       formatString = NULL;<br />       printf(formatString);<br />       <span style="color: #0000FF; ">return</span> 0;<br />   }</div><div></div><div> </div><div> </div><div>C++淇″彿澶勭悊C++ Singal Handling</div><div></div><div>C++鎻愪緵浜嗚縐頒負淇″彿鐨勪腑鏂満鍒躲備綘鍙互浣跨敤signal()鍑芥暟澶勭悊淇″彿銆?/div><div>Visual C++鎻愪緵浜?涓被鍨嬬殑淇″彿錛?/div><div>l SIGABRT Abnormal termination</div><div>l SIGFPE Floating-point error</div><div>l SIGILL Illegal instruction</div><div>l SIGINT CTRL+C signal</div><div>l SIGSEGV Illegal storage access</div><div>l SIGTERM</div><div>MSDN涓SIGILL, SIGSEGV,鍜孲IGTERM are not generated under Windows NT騫朵笖涓嶢NSI鐩稿吋瀹廣備絾鏄紝濡傛灉浣犲湪涓葷嚎紼嬩腑璁劇疆SIGSEGV signal handler錛孋RT灝嗕細璋冪敤瀹冿紝鑰屼笉鏄皟鐢⊿etUnhandledExceptionFilter()鍑芥暟璁劇疆鐨凷HE exception handler錛屽叏灞鍙橀噺_pxcptinfoptrs涓寘鍚簡鎸囧悜寮傚父淇℃伅鐨勬寚閽堛?/div><div>_pxcptinfoptrs涔熶細琚敤浜嶴IGFPE handler涓紝鑰屽湪鎵鏈夊叾浠栫殑signal handlers涓紝瀹冨皢浼氳璁句負NULL銆?/div><div>褰撲竴涓猣loating point 閿欒鍙戠敓鏃訛紝渚嬪闄ら浂閿欙紝CRT灝嗚皟鐢⊿IGFPE signal handler銆傜劧鑰岋紝榛樿鎯呭喌涓嬶紝涓嶄細浜х敓float point 寮傚父錛屽彇鑰屼唬涔嬬殑鏄紝灝嗕細浜х敓涓涓狽aN鎴栨棤絀峰ぇ鐨勬暟浣滀負榪欑嫻偣鏁拌繍綆楃殑緇撴灉銆傚彲浠ヤ嬌鐢╛controlfp_s()鍑芥暟浣垮緱緙栬瘧鍣ㄨ兘澶熶駭鐢焒loating point寮傚父銆?/div><div>浣跨敤raise()鍑芥暟錛屼綘鍙互浜哄伐鍦頒駭鐢熸墍鏈夌殑6涓俊鍙楓備緥濡傦細</div><div></div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->   #include <cstdlib><br />   #include <csignal><br />   #include <iostream><br />    <br />   <span style="color: #0000FF; ">void</span> sigabrt_handler(<span style="color: #0000FF; ">int</span>){<br />       <span style="color: #008000; ">//</span><span style="color: #008000; "> Caught SIGABRT C++ signal<br />       </span><span style="color: #008000; ">//</span><span style="color: #008000; "> Terminate program</span><span style="color: #008000; "><br /></span>            std::cout << "handled.\n";<br />            exit(1);<br />   }<br />    <br />   <span style="color: #0000FF; ">int</span> main(){<br />     signal(SIGABRT, sigabrt_handler);<br />     <span style="color: #008000; ">//</span><span style="color: #008000; "> Cause abort</span><span style="color: #008000; "><br /></span>     abort();   <br />   } </div></div><div></div><div> </div><div>Note:</div><div>铏界劧MSDN涓病鏈夎緇嗗湴璇存槑錛屼絾鏄綘搴旇涓轟綘紼嬪簭涓殑姣忎釜綰跨▼閮藉畨瑁匰IGFPE, SIGILL鍜孲IGSEGV signal hanlders銆係IGABRT, SIGINT鍜孲IGTERM signal hanlders瀵圭▼搴忎腑鐨勬瘡涓嚎紼嬮兘璧蜂綔鐢紝鍥犳浣犲彧闇瑕佸湪浣犵殑main鍑芥暟涓畨瑁呬粬浠竴嬈″氨澶熶簡銆?/div><div>鑾峰彇寮傚父淇℃伅 Retrieving Exception Information</div><div></div><div>璇戣呮敞錛氳繖涓灝忚妭涓嶅お鎳傦紝浠ュ悗鏈夋椂闂村啀緲昏瘧</div><div>When an exception occurs you typically want to get the CPU state to determine the place in your code that caused the problem. You use the information to debug the problem. The way you retrieve the exception information differs depending on the exception handler you use.</div><div>In the SEH exception handler set with the SetUnhandledExceptionFilter() function, the exception information is retrieved from EXCEPTION_POINTERS structure passed as function parameter.</div><div> </div><div>In __try{}__catch(Expression){} construction you retrieve exception information using GetExceptionInformation() intrinsic function and pass it to the SEH exception filter function as parameter.</div><div> </div><div>In the SIGFPE and SIGSEGV signal handlers you can retrieve the exception information from the _pxcptinfoptrs global CRT variable that is declared in <signal.h>. This variable is not documented well in MSDN.</div><div> </div><div>In other signal handlers and in CRT error handlers you have no ability to easily extract the exception information. I found a workaround used in CRT code (see CRT 8.0 source files, invarg.c, line 104).</div><div> </div><div>The following code shows how to get current CPU state used as exception information.</div><div></div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->   <span style="color: #0000FF; ">#if</span> _MSC_VER>=1300<br />   #include <rtcapi.h><br />   <span style="color: #0000FF; ">#endif</span><br />   <br />   #ifndef _AddressOfReturnAddress<br />   <br />   <span style="color: #008000; ">//</span><span style="color: #008000; "> Taken from: </span><span style="color: #008000; text-decoration: underline; ">http://msdn.microsoft.com/en-us/library/s975zw7k</span><span style="color: #008000; ">(VS.71).aspx</span><span style="color: #008000; "><br /></span>   #ifdef __cplusplus<br />   <span style="color: #0000FF; ">#define</span> EXTERNC extern "C"<br />   <span style="color: #0000FF; ">#else</span><br />   <span style="color: #0000FF; ">#define</span> EXTERNC<br />   <span style="color: #0000FF; ">#endif</span><br />   <br />   <span style="color: #008000; ">//</span><span style="color: #008000; "> _ReturnAddress and _AddressOfReturnAddress should be prototyped before use </span><span style="color: #008000; "><br /></span>   EXTERNC <span style="color: #0000FF; ">void</span> * _AddressOfReturnAddress(<span style="color: #0000FF; ">void</span>);<br />   EXTERNC <span style="color: #0000FF; ">void</span> * _ReturnAddress(<span style="color: #0000FF; ">void</span>);<br />   <br />   <span style="color: #0000FF; ">#endif</span> <br />   <br />   <span style="color: #008000; ">//</span><span style="color: #008000; "> The following function retrieves exception info</span><span style="color: #008000; "><br /></span>   <br />   <span style="color: #0000FF; ">void</span> GetExceptionPointers(DWORD dwExceptionCode, <br />                             EXCEPTION_POINTERS** ppExceptionPointers)<br />   {<br />       <span style="color: #008000; ">//</span><span style="color: #008000; "> The following code was taken from VC++ 8.0 CRT (invarg.c: line 104)</span><span style="color: #008000; "><br /></span>   <br />       EXCEPTION_RECORD ExceptionRecord;<br />       CONTEXT ContextRecord;<br />       memset(&ContextRecord, 0, <span style="color: #0000FF; ">sizeof</span>(CONTEXT));<br />   <br />   #ifdef _X86_<br />   <br />       __asm {<br />           mov dword ptr [ContextRecord.Eax], eax<br />               mov dword ptr [ContextRecord.Ecx], ecx<br />               mov dword ptr [ContextRecord.Edx], edx<br />               mov dword ptr [ContextRecord.Ebx], ebx<br />               mov dword ptr [ContextRecord.Esi], esi<br />               mov dword ptr [ContextRecord.Edi], edi<br />               mov word ptr [ContextRecord.SegSs], ss<br />               mov word ptr [ContextRecord.SegCs], cs<br />               mov word ptr [ContextRecord.SegDs], ds<br />               mov word ptr [ContextRecord.SegEs], es<br />               mov word ptr [ContextRecord.SegFs], fs<br />               mov word ptr [ContextRecord.SegGs], gs<br />               pushfd<br />               pop [ContextRecord.EFlags]<br />       }<br />   <br />       ContextRecord.ContextFlags = CONTEXT_CONTROL;<br />   #pragma warning(push)<br />   #pragma warning(disable:4311)<br />       ContextRecord.Eip = (ULONG)_ReturnAddress();<br />       ContextRecord.Esp = (ULONG)_AddressOfReturnAddress();<br />   #pragma warning(pop)<br />       ContextRecord.Ebp = *((ULONG *)_AddressOfReturnAddress()-1);<br />   <br />   <br />   <span style="color: #0000FF; ">#elif</span> defined (_IA64_) || defined (_AMD64_)<br />   <br />       <span style="color: #008000; ">/*</span><span style="color: #008000; "> Need to fill up the Context in IA64 and AMD64. </span><span style="color: #008000; ">*/</span><br />       RtlCaptureContext(&ContextRecord);<br />   <br />   <span style="color: #0000FF; ">#else</span>  /* defined (_IA64_) || defined (_AMD64_) */<br />   <br />       ZeroMemory(&ContextRecord, <span style="color: #0000FF; ">sizeof</span>(ContextRecord));<br />   <br />   <span style="color: #0000FF; ">#endif</span>  /* defined (_IA64_) || defined (_AMD64_) */<br />   <br />       ZeroMemory(&ExceptionRecord, <span style="color: #0000FF; ">sizeof</span>(EXCEPTION_RECORD));<br />   <br />       ExceptionRecord.ExceptionCode = dwExceptionCode;<br />       ExceptionRecord.ExceptionAddress = _ReturnAddress();<br />   <br />   <br />       EXCEPTION_RECORD* pExceptionRecord = <span style="color: #0000FF; ">new</span> EXCEPTION_RECORD;<br />       memcpy(pExceptionRecord, &ExceptionRecord, <span style="color: #0000FF; ">sizeof</span>(EXCEPTION_RECORD));<br />       CONTEXT* pContextRecord = <span style="color: #0000FF; ">new</span> CONTEXT;<br />       memcpy(pContextRecord, &ContextRecord, <span style="color: #0000FF; ">sizeof</span>(CONTEXT));<br />   <br />       *ppExceptionPointers = <span style="color: #0000FF; ">new</span> EXCEPTION_POINTERS;<br />       (*ppExceptionPointers)->ExceptionRecord = pExceptionRecord;<br />       (*ppExceptionPointers)->ContextRecord = pContextRecord;  <br />   }</div></div><div></div><div>Visual C++ Complier Flags</div><div></div><div>Visual C++緙栬瘧鍣ㄤ腑鏈変竴浜涚紪璇戦夐」鍜屽紓甯稿鐞嗘湁鍏熾?/div><div>鍦≒roject Properties->Configuration Properties->C/C++ ->Code Generation涓彲浠ユ壘鍒拌繖浜涢夐」銆?/div><div>寮傚父澶勭悊妯″瀷Exception Handling Model</div><div>浣犲彲浠ヤ負VC++緙栬瘧鍣ㄩ夋嫨寮傚父澶勭悊妯″瀷銆傞夐」/EHs(鎴栬匛Hsc)鐢ㄦ潵鎸囧畾鍚屾寮傚父澶勭悊妯″瀷錛?EHa鐢ㄦ潵鎸囧畾寮傛寮傚父澶勭悊妯″瀷銆傚彲浠ユ煡鐪嬩笅闈㈠弬鑰冨皬鑺傜殑"/EH(Exception Handling Model)"浠ヨ幏鍙栨洿澶氱殑淇℃伅銆?/div><div>Floating Point Exceptions</div><div>浣犲彲浠ヤ嬌鐢?fp:except緙栬瘧閫夐」鎵撳紑float point exceptions銆?/div><div>緙撳啿鍖哄畨鍏ㄦ鏌uffer Security Checks</div><div>浣犲彲浠ヤ嬌鐢?GS(Buffer Security Check)閫夐」鏉ュ己鍒剁紪璇戝櫒鎻掑叆浠g爜浠ユ鏌ョ紦鍐插尯婧㈠嚭銆傜紦鍐插尯婧㈠嚭鎸囩殑鏄竴澶у潡鏁版嵁琚啓鍏ヤ竴鍧楄緝灝忕殑緙撳啿鍖轟腑銆傚綋媯嫻嬪埌緙撳啿鍖烘孩鍑猴紝CRT calls internal security handler that invokes Watson directly銆?/div><div>Note:</div><div>鍦╒C++(CRT7.1)涓紝緙撳啿鍖烘孩鍑鴻媯嫻嬪埌鏃訛紝CRT浼氳皟鐢ㄧ敱_set_security_error_handler鍑芥暟璁劇疆鐨勫鐞嗗櫒銆傜劧鑰岋紝鍦ㄤ箣鍚庣殑VC鐗堟湰涓繖涓嚱鏁拌搴熷純銆?/div><div>浠嶤RT8.0寮濮嬶紝浣犲湪浣犵殑浠g爜涓笉鑳芥埅鑾峰畨鍏ㄩ敊璇傚綋緙撳啿鍖烘孩鍑鴻媯嫻嬪埌鏃訛紝CRT浼氱洿鎺ヨ姹俉atson錛岃屼笉鏄皟鐢╱nhandled exception filter銆傝繖鏍峰仛鏄敱浜庡畨鍏ㄥ師鍥犲茍涓斿井杞笉鎵撶畻鏀瑰彉榪欑琛屼負銆?/div><div>鏇村鐨勪俊鎭鍙傝冨涓嬮摼鎺?/div><div>https://connect.microsoft.com/VisualStudio/feedback/details/101337/a-proposal-to-make-dr-watson-invocation-configurable</div><div>http://blog.kalmbachnet.de/?postid=75</div><div>寮傚父澶勭悊鍜孋RT閾炬帴Exception Handling and CRT Linkage</div><div></div><div>浣犵殑搴旂敤紼嬪簭涓殑姣忎釜module錛圗XE, DLL錛夐兘闇瑕侀摼鎺RT銆備綘鍙互灝咰RT閾炬帴涓哄綰跨▼闈欐佸簱(multi-threaded static library)鎴栬呭綰跨▼鍔ㄦ侀摼鎺ュ簱(multi-threaded dynamic link library)銆傚鏋滀綘璁劇疆浜咰RT error handlers錛屼緥濡備綘璁劇疆浜唗erminate handler, unexcepted handler, pure call handler, invalid parameter handler, new operator error handler or a signal handler錛岄偅涔堜粬浠皢鍙湪浣犻摼鎺ョ殑CRT涓婅繍琛岋紝騫朵笖涓嶄細鎹曡幏鍏朵粬CRT妯″潡涓殑寮傚父錛堝鏋滃瓨鍦ㄧ殑璇濓級錛屽洜涓烘瘡涓狢RT妯″潡閮芥湁瀹冭嚜宸辯殑鍐呴儴鐘舵併?/div><div>澶氫釜宸ョ▼涓殑module鍙互鍏變韓CRT DLL銆傝繖灝嗕嬌寰楄閾炬帴鐨凜RT浠g爜杈懼埌鏈灝忓寲錛屽茍涓擟RT DLL涓殑鎵鏈夊紓甯擱兘浼氳绔嬪埢澶勭悊銆傝繖涔熸槸鎺ㄨ崘浣跨敤multi-threaded CRT DLL浣滀負CRT閾炬帴鏂瑰紡鐨勫師鍥犮?/div><img src ="http://m.shnenglu.com/API/aggbug/208965.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/API/" target="_blank">C++鎶鏈腑蹇?/a> 2014-11-26 15:12 <a href="http://m.shnenglu.com/API/archive/2014/11/26/208965.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>panel鍜寃xBoxSizerhttp://m.shnenglu.com/API/archive/2014/09/28/208442.htmlC++鎶鏈腑蹇?/dc:creator>C++鎶鏈腑蹇?/author>Sun, 28 Sep 2014 08:13:00 GMThttp://m.shnenglu.com/API/archive/2014/09/28/208442.htmlhttp://m.shnenglu.com/API/comments/208442.htmlhttp://m.shnenglu.com/API/archive/2014/09/28/208442.html#Feedback0http://m.shnenglu.com/API/comments/commentRss/208442.htmlhttp://m.shnenglu.com/API/services/trackbacks/208442.html//1.鍔犲叆boxSizer19
    wxBoxSizer* topSizer = new wxBoxSizer(wxVERTICAL);
    this->SetSizer(topSizer);
    
    

    wxPanel* upPanel = new wxPanel( this, ID_BOT_PANEL2 ,wxDefaultPosition, wxSize(800, 100));

    upPanel->SetBackgroundColour(*wxBLACK);//榛戣壊鑳屾櫙

    wxPanel* centerPanel = new wxPanel( this, ID_BOT_PANEL3,wxDefaultPosition, wxSize(800, 100) );
    centerPanel->SetBackgroundColour(*wxWHITE);//鐧借壊鑳屾櫙

    wxPanel* bottomPanel = new wxPanel( this, ID_BOT_PANEL4, wxDefaultPosition, wxSize(800, 100));
    
    bottomPanel->SetBackgroundColour(*wxRED);//綰㈣壊鑳屾櫙
    
    topSizer->Add(upPanel,
        1,                   //鍨傜洿鏂瑰悜鍙媺浼?/span>
        wxEXPAND|            //姘村鉤鏂瑰悜鑷姩濉厖
        wxALL,               //鍥涘懆閮芥湁杈規
        10                   //杈規瀹藉害涓?0
        );

    
    topSizer->Add(centerPanel,0,wxEXPAND);
    topSizer->Add(bottomPanel,0,wxEXPAND);

]]>
鍏充簬warning C4819http://m.shnenglu.com/API/archive/2012/11/12/195056.htmlC++鎶鏈腑蹇?/dc:creator>C++鎶鏈腑蹇?/author>Mon, 12 Nov 2012 02:00:00 GMThttp://m.shnenglu.com/API/archive/2012/11/12/195056.htmlhttp://m.shnenglu.com/API/comments/195056.htmlhttp://m.shnenglu.com/API/archive/2012/11/12/195056.html#Feedback5http://m.shnenglu.com/API/comments/commentRss/195056.htmlhttp://m.shnenglu.com/API/services/trackbacks/195056.html緙栬瘧VC++紼嬪簭鐨勬椂鍊欏嚭鐜板涓嬫彁紺鴻鍛婏細

warning C4819: The file contains a character that cannot be represented in the current code page (936). Save the file in Unicode format to prevent data loss

鍥犱負鍙槸涓涓獁arning錛屼笉褰卞搷姝e父緙栬瘧錛屾墍浠ュ茍娌℃湁寮曡搗澶у澶氬ぇ鐨勫叧娉ㄣ傛垜涓寮濮嬬殑鏃跺欎篃鏄姝ゃ備絾鏄悗鏉ュ嚭鐜扮殑嬈℃暟澶氫簡錛屽彂鐜拌繖涓鍛婂拰鍦ㄧ▼搴廌ebug鐨勬椂鍊?br />鏃犳硶鍋滃湪鏂偣錛屽埛鍒峰埛灝辮繃鍘諱簡鏍規湰鏃犳硶榪涜Debug銆傝岀姜欖佺ジ棣栧氨鏄繖涓獁arning錛屾敼姝d簡榪欎釜warning灝辮兘榪涜Debug浜嗐?/p>

涓嬮潰璁茶堪鎴戞槸鎬庝箞娑堥櫎榪欎釜璀﹀憡鐨勩?/p>

榪欎釜璀﹀憡鐨勬剰鎬濇槸錛氬湪璇ユ枃浠朵腑鏈変竴涓垨澶氫釜瀛楃涓嶆槸Unicode瀛楃錛佽姹傛妸榪欎釜瀛楃鍙樻垚Unicode瀛楃銆?/p>

闅鵑錛氬湪緙栬瘧淇℃伅閲屽茍娌℃湁鎻愮ず鏄摢涓瓧絎︼紝鎴栬呮槸鍦ㄥ摢涓琛岄噷鍑虹幇鐨勮瀛楃銆傛煡鎵捐搗鏉ラ潪甯哥殑闅撅紝鐢氳嚦鏄笉鍙兘鐨勪換鍔★紒

鎴戝湪緗戠粶涓婃壘浜嗗ソ澶氳祫鏂欓兘娌℃湁鎵懼埌瑙e喅鏂規硶銆傚洜涓哄ぇ瀹墮兘涓嶆敞鎰忚繖涓笉褰卞搷緙栬瘧鐨勮鍛娿傚悗鏉ュ湪涓涓浗澶栫殑緗戠珯涓婃壘鍒頒簡瑙e喅鐨勬柟娉曘傚緢綆鍗曪紝榪欎釜鏂規硶鏍規湰涓嶉渶瑕佺煡閬撳叿浣撴槸鍝釜瀛楃鍦ㄦ崳楝鹼紒

瑙e喅鏂規硶錛氭墦寮鍑虹幇warning鐨勬枃浠訛紝Ctrl+A鍏ㄩ夛紝鐒跺悗鍦ㄦ枃浠惰彍鍗曪細file->advanced save options 錛屽湪寮瑰嚭鐨勯夐」涓夋嫨鏂扮殑緙栫爜鏂瑰紡涓猴細UNICODE codepage 1200 錛岀偣鍑葷‘瀹氾紝闂灝辮В鍐充簡銆?/p>

]]>
Memcache瀛樺偍澶ф暟鎹殑闂http://m.shnenglu.com/API/archive/2012/10/19/193536.htmlC++鎶鏈腑蹇?/dc:creator>C++鎶鏈腑蹇?/author>Fri, 19 Oct 2012 09:20:00 GMThttp://m.shnenglu.com/API/archive/2012/10/19/193536.htmlhttp://m.shnenglu.com/API/comments/193536.htmlhttp://m.shnenglu.com/API/archive/2012/10/19/193536.html#Feedback0http://m.shnenglu.com/API/comments/commentRss/193536.htmlhttp://m.shnenglu.com/API/services/trackbacks/193536.htmlMemcached瀛樺偍鍗曚釜item鏈澶ф暟鎹槸鍦?MB鍐咃紝濡傛灉鏁版嵁瓚呰繃1M,瀛樺彇set鍜実et鏄兘鏄繑鍥瀎alse錛岃屼笖寮曡搗鎬ц兘鐨勯棶棰樸?/span>

鎴戜滑涔嬪墠瀵規帓琛屾鐨勬暟鎹繘琛岀紦瀛橈紝鐢變簬鎺掕姒滃湪鎴戜滑鎵鏈塻ql select鏌ヨ閲岄潰鍗犱簡30%錛岃屼笖鎴戜滑鎺掕姒滄瘡灝忔椂鏇存柊涓嬈★紝鎵浠ュ繀欏誨鏁版嵁鍋氱紦瀛樸備負浜嗘竻闄ょ紦瀛樻柟渚匡紝鎶婃墍鏈夌殑鐢ㄦ埛鐨勬暟鎹斁鍦ㄥ悓涓key涓紝鐢變簬memcached:set鐨勬椂鍊欐病鏈夊帇緙╂暟鎹傚湪嫻嬭瘯鏈嶆祴璇曠殑鏃跺欙紝娌″彂鐜伴棶棰橈紝褰撲笂綰跨殑鏃跺欙紝緇撴灉鍙戠幇錛屽湪綰夸漢鏁板垰鍒?90浜虹殑鏃跺欙紝鏈嶅姟鍣╨oad average椋樺埌7.9銆傜劧鍚庢垜浠幓鎺夌紦瀛橈紝涓涓嬪瓙灝變笅闄嶅埌0.59銆?/span>

鎵浠emcahce涓嶉傚悎緙撳瓨澶ф暟鎹紝瓚呰繃1MB鐨勬暟鎹?/span>錛屽彲浠ヨ冭檻鍦ㄥ鎴風鍘嬬緝鎴栨媶鍒嗗埌澶氫釜key涓傚ぇ鐨勬暟鎹湪榪涜load鍜寀ppack鍒板唴瀛樼殑鏃跺欓渶瑕佽姳寰堥暱鏃墮棿錛屼粠鑰岄檷浣庢湇鍔″櫒鐨勬ц兘銆?/span>

Memcached鏀寔鏈澶х殑瀛樺偍瀵硅薄涓?/span>1M銆傝繖涓肩敱鍏跺唴瀛樺垎閰嶆満鍒跺喅瀹氱殑銆?/span>

memcached榛樿鎯呭喌涓嬮噰鐢ㄤ簡鍚嶄負Slab Allocator鐨勬満鍒跺垎閰嶃佺鐞嗗唴瀛樸傚湪璇ユ満鍒跺嚭鐜頒互鍓嶏紝鍐呭瓨鐨勫垎閰嶆槸閫氳繃瀵規墍鏈夎褰曠畝鍗曞湴榪涜malloc鍜?/span>free鏉ヨ繘琛岀殑銆備絾鏄紝榪欑鏂瑰紡浼氬鑷村唴瀛樼鐗囷紝鍔犻噸鎿嶄綔緋葷粺鍐呭瓨綆$悊鍣ㄧ殑璐熸媴錛屾渶鍧忕殑鎯呭喌涓嬶紝浼氬鑷存搷浣滅郴緇熸瘮memcached榪涚▼鏈韓榪樻參銆?/span>Slab Allocator灝辨槸涓鴻В鍐寵闂鑰岃癁鐢熺殑銆?span style="font-family: 瀹嬩綋; font-size: 10.5pt">Slab Allocator鐨勫熀鏈師鐞嗘槸鎸夌収棰勫厛瑙勫畾鐨勫ぇ灝忥紝灝嗗垎閰嶇殑鍐呭瓨鍒嗗壊鎴愮壒瀹氶暱搴︾殑鍧楋紝浠ュ畬鍏ㄨВ鍐沖唴瀛樼鐗囬棶棰?

浠婂ぉ錛?012-03-16錛夋垜浠噸鏂版祴璇曚簡memcached ::set鐨勬暟鎹ぇ灝忋傚彲鑳芥槸鎴戜滑鐢╬hp鐨刴emcached鎵╁睍鏄渶鏂扮増錛宻et鏁版嵁鐨勬椂鍊欐槸榛樿鍘嬬緝鐨勩俿et 鏁版嵁錛?/span>

  1. $ac = new memcahed();
  2. $data = str_repeat('a', 1024* 1024); //1M鐨勬暟鎹?
  3. $r = $ac->set('key', $data, 9999);
  4. //鎴栬?
  5. $data = str_repeat('a', 1024* 1024*100);//100M鐨勬暟鎹?
  6. $r = $ac->set('key', $data, 9999);

 

 

 

涓嶈鏄?M鐨勬暟鎹繕鏄?00M鐨勬暟鎹紝閮借兘set鎴愬姛銆傚悗鏉ユ垜鍙戠幇錛宮emcachedset鏁版嵁鐨勬椂鍊欐槸榛樿鍘嬬緝鐨勩傜敱浜庤繖涓繖涓槸閲嶅鐨勫瓧絎︿覆錛屽帇緙╃巼楂樿揪1000鍊嶃傚洜姝?00M鐨勬暟鎹帇緙╁悗瀹為檯涔熷氨100k鑰屽凡銆?/span>

褰撴垜璁劇疆錛?/span>

  1. $ac->setOption(memcahed::OPT_COMPRESSION,0); //涓嶅帇緙╁瓨鍌ㄦ暟鎹?
  2. $data = str_repeat('a', 1024* 1024); //1M鏁版嵁
  3. $r = $ac->set('key', $data, 9999);//1M鐨勬暟鎹畇et涓嶆垚鍔熴?