锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
銆銆涓嶈繃蹇熷紑鍙戞椂錛屾垜浠茍涓嶄細灞闄愪簬涓縐嶈璦錛屽緢澶氭椂鍊欓兘鏄販鐢ㄥ縐嶈璦錛屽疄鐜頒竴涓己澶у張緇氫附鐨刄I鐨勮蔣浠訛紝鑰屼笖鍙互淇濊瘉寮鍙戦熷害寰堝揩銆?
銆銆姣忎竴縐嶈璦閮芥湁鐙壒鐨勪紭鍔匡紝鏈変紭鍔跨殑閮ㄥ垎鎭版伆灝辨槸寰堥傚悎搴旂敤鐨勫満鏅紝鍥犳緙栫爜瀹炵幇鏂逛究蹇熴傚茍涓嶆槸璇碈++寮鍙戠▼搴忓氨涓瀹氬緢鎱紝涔熶笉鏄C#寮鍙戠▼搴忓氨涓瀹氬揩銆傚鏋滆鍋氬亸搴曞眰鐨勫姛鑳斤紝寰寰C++瀹炵幇璧鋒潵榪樻槸寰堝揩錛岃屼笖紼嬪簭鐨勬墽琛屾晥鐜囦篃鏄緢楂樼殑銆傚浜庡簳灞傜殑鎿嶄綔錛屼嬌鐢–#絳夎璦鏉ヨ錛屽氨闈炲父涓嶆柟渚褲傛瘮濡傝皟鐢ㄤ釜緋葷粺API鍑芥暟錛孋/C++鍖呭惈涓涓ご鏂囦歡錛岀劧鍚庣洿鎺ュ啓鍑芥暟鍚嶇О鍗沖彲錛岃屽叾浠栬璦鍒欐瘮杈冮夯鐑︿簡銆傚洜涓轟粬浠閫氳繃涓灞傚嚱鏁板簱鐨勫皝瑁呴棿鎺ヨ皟鐢ㄥ簳灞侫PI鐨勶紝鎵浠ヤ篃灝卞緢楹葷儲浜嗐?
銆銆涓嶈繃錛屾鏄皝瑁呯殑澶氾紝浣跨敤鐨勫簱澶氾紝瀵逛簬C#榪欑被璇█鏉ヨ錛屽疄鐜扮晫闈㈠氨寰堝揩浜嗐傛墍浠ヨ錛屽仛UI鏄粬浠殑闀垮錛屾墍浠ヤ篃寰堢畝鍗曘?
銆銆閭d箞鏃㈢劧濡傛錛屾垜浠氨灝咰++鍜孋#緇撳悎鏉ヤ嬌鐢ㄥ氨寰堝ソ錛岃繖鍙仛寮哄己鑱斿悎錛侀夋嫨C#涔熸槸鍥犱負璇硶涓婂拰C++寰堢浉浼鹼紝VB榪欎簺璇█璇硶鍜孋++鐩稿樊寰堝ぇ錛屼笉涔犳儻銆?/font>
銆銆閭d箞C++鍋氬簳灞傚姛鑳藉皝瑁呭拰C#鐣岄潰寮鍙戝浣曟販鍚堣搗鏉ュ憿錛熻繖涓及璁℃槸澶у鏈涓哄叧蹇冪殑涓涓棶棰樺惂銆傚湪瀹炵幇鐣岄潰鏃訛紝C#鍙互閫夋嫨wpf鍋氱晫闈紝闈炲父鐨勪笉閿欍傚涔犻毦搴︿篃涓嶅ぇ錛孋#浠g爜錛屽浜嶤++鐔熸倝鐨勪漢錛屼篃瑙夊緱寰堝ソ鎺屾彙銆侰++浠庝笟鑰呭幓浣跨敤C#闂涓嶅ぇ錛屽彧鏄細澶氬悙妲戒竴涓婥#鐨勪笉鏂逛究鎿嶄綔鎸囬拡涔嬬被鐨勶紝涓嶈繃C#鐨剆tring紜疄鎸轟笉閿欑殑錛屾垜铔枩嬈€?
銆銆C++灝佽浠g爜鎴恉ll褰㈠紡鎻愪緵緇機#絳夎璦浣跨敤銆侰++浠g爜涓紝浣犲彲浠ュ敖鎯呯殑浣跨敤綾繪潵瀹屾垚鍔熻兘錛屽彧鏄湪瀵煎嚭鍑芥暟鏃訛紝鍙鎻愪緵C璇█鐨勫嚱鏁幫紝鑰屼笉瑕佸皢綾誨鍑猴紝涓嶅緩璁繖涔堝仛銆傝屽鍑哄嚱鏁版椂錛屼負浜嗚鏇村璇█鏂逛究浣跨敤dll錛屽鍑哄嚱鏁頒嬌鐢–璋冪敤綰﹀畾瀵煎嚭鍑芥暟銆備竴鑸璦閮芥敮鎸佹爣鍑咰鍑芥暟璋冪敤綰﹀畾銆?
銆銆鏇村鐨勭粏鑺傦紝灝變笉鍦ㄦ湰鏂囪榪般傝繖閲屽氨鏄榪版х殑緇欏ぇ瀹朵竴涓嵃璞★紝璁╀綘鐭ラ亾鍐欑▼搴忚繕鍙互榪欐牱鐜╁摝銆備笉瑕佸皢鑷繁鐨勬濈淮灞闄愪簬涓縐嶈璦錛屼笉瑕佸啀涓哄涔犲摢涓縐嶈璦鑰岀籂緇擄紝涔熶笉瑕佷負鍝竴縐嶈璦濂借屼簤鎵с?
銆銆涓嶈繃錛屽垵瀛﹁呮昏閫夊畾涓縐嶈璦浣滀負鍑哄彂錛岃屾垜鐨勫緩璁椂錛屽涔犳椂灝藉彲鑳藉熀紜鑰屽叏闈㈢殑瀛︿範銆傚湪鍏ラ棬鐨勬椂鍊欙紝鐩稿鏉ヨ鏄瘮杈冩矇寰椾笅蹇冨涔犵殑銆傛墍浠ラ夋嫨瀛︿範C++浣滀負鍏ラ棬璇█鏄潪甯鎬笉閿欑殑閫夋嫨銆傚綋浣燙++瀛︾殑涓嶉敊鐨勬椂鍊欙紝鍐嶅鍏朵粬璇█鍋氬簲鐢ㄥ紑鍙戯紝閮芥槸杞繪澗鎺屾彙鐨勩備絾鏄鏋滃伐浣滀簡錛屽啀鏉ュ涔燙++錛岀簿鍔涙湁闄愶紝鑰屼笖寰堥毦闈欎笅蹇冨涔犲張澶у張鍏ㄥ張緇嗙殑C++銆?
銆銆鐒惰屽仛搴曞眰寮鍙戞椂錛孋++鏃犵枒鏄竴涓緢濂界殑閫夋嫨銆傚鏋淐++鍊熺敤鐣岄潰搴擄紝鑷劧涔熸槸鍙互鍋氬緢涓嶉敊鐨刄I鐨勩傚叾浠栬璦涔嬫墍浠ュ彲浠ュ揩閫熷紑鍙戯紝涔熷氨鏄湁寰堝搴撶殑鏀寔銆傚綋C++鐨勭涓夋柟搴撳浜嗭紝寮鍙戦熷害鑷劧涔熸槸寰堜笉閿欑殑銆?
銆銆濡傛灉浣犳湁涓浜涗笉閿欑殑鎯蟲硶錛屽氨鍒癈++鎶鏈綉鍒嗕韓涓嬪惂銆傛垜浼氫粩緇嗛槄璇繪瘡涓涓瓧閫忛湶鍑烘潵鐨勬皵鎭紝緇欎綘鍒嗕韓鎴戠殑鐩稿叧緇忛獙錛屽敖閲忓紑闃斾綘鐨勬濈淮鑼冨洿錛屼竴璧瘋繘姝ャ?
銆銆浠涔堟槸RAII浠ュ強鍑犱釜渚嬪瓙
銆銆鍦–++絳夐潰鍚戝璞¤璦涓紝涓轟簡綆$悊灞閮ㄨ祫婧愮殑鍒嗛厤浠ュ強閲婃斁(resource allocation and deallocation)錛屽疄鐜板紓甯稿畨鍏?exception-safe)銆侀伩鍏嶅唴瀛樻硠闇茬瓑闂錛孋++涔嬬埗Bjarne Stroustrup鍙戞槑浜嗕竴縐嶅彨鍋?#8221;鍒濆鍖栦腑鑾峰彇璧勬簮“ (RAII, Resource Acquisition Is Initialization錛屼篃鍙互鍙仛Scope-Bound Resource Management)鐨勬妧鏈傜畝鍗曟潵璇達紝瀹冪殑鐩殑灝辨槸鍒╃敤涓涓眬閮ㄥ璞★紝鍦ㄨ繖涓璞$殑鏋勯犲嚱鏁板唴鍒嗛厤璧勬簮錛岀劧鍚庡湪鍏舵瀽鏋勫嚱鏁板唴閲婃斁璧勬簮銆傝繖鏍鳳紝褰撹繖涓眬閮ㄥ璞¢鍑轟綔鐢ㄥ煙鏃訛紝瀹冩墍瀵瑰簲鐨勭殑璧勬簮鍗沖彲鑷姩閲婃斁銆傚湪瀹炵幇涓婏紝瀹冮氬父鏈変笁涓壒鐐癸細
銆銆鍒涘緩涓涓壒孌婄被錛屽湪鍏舵瀯閫犲嚱鏁板垵鐢寵璧勬簮;
銆銆灝佽鐩爣瀵硅薄錛屽皢鐢寵璧勬簮鐨勭洰鏍囧璞′綔涓鴻繖涓壒孌婄被鐨勬垚鍛樺彉閲?
銆銆鍦ㄨ繖涓被鐨勬瀽鏋勫嚱鏁板唴錛岄噴鏀捐祫婧愩?br />
銆銆涓涓吀鍨嬬殑渚嬪瓙灝辨槸鏍囧噯搴撲腑鎻愪緵鐨勬ā鏉跨被std::auto_ptr銆傚鍦ㄣ奀++紼嬪簭璁捐璇█銆?銆奣he C++ Programming Language, Special Edition銆? Bjarne Stroustrup钁楋紝瑁樺畻鐕曡瘧)涓327欏墊墍鎻忚堪鐨?strong>SAT絳旀
銆銆1: template
銆銆2: class std::auto_ptr {
銆銆3:
銆銆4: public:
銆銆5: //鍦ㄦ瀯閫犲嚱鏁頒腑錛岃幏寰楃洰鏍囨寚閽堢殑綆$悊鏉?br />
銆銆6: explicit auto_ptr(X *p = 0) throw() { ptr = p; }
銆銆7: //鍦ㄦ瀽鏋勫嚱鏁頒腑錛岄噴鏀劇洰鏍囨寚閽?br />
銆銆8: ~auto_ptr() throw() { delete ptr; }
銆銆9:
銆銆10: //...
銆銆11:
銆銆12: //閲嶈*鍜?>榪愮畻絎︼紝浣縜uto_ptr瀵硅薄鍍忕洰鏍囨寚閽坧tr涓鏍蜂嬌鐢?br />
銆銆13: X& operator*() const throw() { return *ptr; }
銆銆14: X* operator->() const throw() { return ptr; }
銆銆15:
銆銆16: //鏀懼純瀵圭洰鏍囨寚閽堢殑綆$悊鏉?br />
銆銆17: X* release() throw() { X* t = ptr; ptr = 0; return t; }
銆銆18:
銆銆19: private:
銆銆20: X *ptr;
銆銆21: };
銆銆鎯寵浣跨敤瀹冿紝闈炲父綆鍗曪紝渚嬪
銆銆1: #include
銆銆2:
銆銆3: void func()
銆銆4: {
銆銆5: std::auto_ptr p(new int);
銆銆6:
銆銆7: //use p just like ptr
銆銆8:
銆銆9: return;
銆銆10: }
銆銆鍙︿竴涓緥瀛愶紝鏄埄鐢℅CC涓殑cleanup attribute銆傚畠鍙互鎸囧畾涓涓嚱鏁幫紝鍦ㄨ鍙橀噺閫鍑轟綔鐢ㄥ煙鏃跺彲浠ユ墽琛屻備緥濡俉ikipedia涓婃彁鍒扮殑瀹?br />
銆銆1: #define RAII_VARIABLE(vartype,varname,initval,dtor) \
銆銆2: void _dtor_ ## varname (vartype * v) { dtor(*v); } \
銆銆3: vartype varname __attribute__((cleanup(_dtor_ ## varname))) = (initval)
銆銆鎴戜滑鍙互榪欐牱浣跨敤錛屼緥濡?br />
銆銆1: void example_usage() {
銆銆2: RAII_VARIABLE(FILE*, logfile, fopen("logfile.txt", "w+"), fclose);
銆銆3: fputs("hello logfile!", logfile);
銆銆4: }
銆銆榪樻湁涓涓緥瀛愶紝鏄湪鍒樻湭楣忕殑鍗氬鏂囩珷”C++11 (鍙婄幇浠++椋庢牸)鍜屽揩閫熻凱浠e紡寮鍙?#8220;涓殑”璧勬簮綆$悊“涓鑺備腑鐪嬪埌鐨勶紝浠栧熷姪C++11鐨剆td::function瀹炵幇浜嗚繖涓鐗規с傛劅鍏磋叮鐨勭爜鍙嬪彲浠ュ埌浠栧崥瀹㈠唴闃呰銆?br />
銆銆絎旇呴噰鐢ㄧ殑鏂規硶
銆銆瀵逛簬new/delete錛屼嬌鐢ㄤ笂闈㈡彁鍒扮殑std::auto_ptr灝卞彲浠ヤ簡錛屼絾鏄浜巒ew/delete[]涓涓姩鎬佺殑涓緇存暟緇勶紝鐢氳嚦浜岀淮鏁扮粍錛宎uto_ptr灝辨棤鑳戒負鍔涗簡銆傝屼笖鍦ㄤ竴浜涢」鐩腑錛岀壒鍒槸涓浜涙湁鐫鎮犱箙鍘嗗彶鐨勪唬鐮佷腑錛岃繕瀛樺湪鐫浣跨敤malloc, new娣風敤鐨勭幇璞°傛墍浠ョ瑪鑰呰璁′簡涓涓猘uto_free_ptr綾伙紝瀹炵幇鐩爣璧勬簮鐨勮嚜鍔ㄥ洖鏀躲傚畠鐨勫疄鐜版瘮杈冪畝鍗曪紝鍙埄鐢ㄤ簡RAII鐨勭涓変釜鐗圭偣——”鍦ㄧ被鐨勬瀽鏋勫嚱鏁板唴閲婃斁璧勬簮”錛屼絾鏈変竴涓紭鐐規槸鍙互鍦ㄧ敵璇峰爢鍐呭瓨浠g爜鍓嶄嬌鐢?strong>鎵樼絳旀
銆銆浠g爜濡備笅錛?br />
銆銆1: //auto_free_ptr is only used for automation free memory
銆銆2: template
銆銆3: class auto_free_ptr
銆銆4: {
銆銆5: public:
銆銆6: typedef enum {invalid, new_one, new_array, alloc_mem} EFLAG;
銆銆7: auto_free_ptr() { initialize(); }
銆銆8: ~auto_free_ptr(){ free_ptr(); }
銆銆9:
銆銆10: ///set the pointer needed to automatically free
銆銆11: inline void set_ptr(T** new_ptr_address, EFLAG new_eflag)
銆銆12: { free_ptr(); p_ptr = new_ptr_address; eflag = new_eflag; }
銆銆13:
銆銆14: ///give up auto free memory
銆銆15: inline void give_up() { initialize(); }
銆銆16:
銆銆17: protected:
銆銆18: inline void initialize() { p_ptr = NULL; eflag = invalid; }
銆銆19: inline void free_ptr() throw()
銆銆20: {
銆銆21: if(!p_ptr || !(*p_ptr)) return;
銆銆22:
銆銆23: switch(eflag)
銆銆24: {
銆銆25: case alloc_mem: { free(*p_ptr), (*p_ptr) = NULL, p_ptr = NULL; break; }
銆銆26: case new_one: { delete (*p_ptr), (*p_ptr) = NULL, p_ptr = NULL; break; }
銆銆27: case new_array: { delete[] (*p_ptr),(*p_ptr) = NULL, p_ptr = NULL; break; }
銆銆28: }
銆銆29: }
銆銆30:
銆銆31: protected:
銆銆32: T** p_ptr; //!< pointer to the address of the set pointer needed to automatically free
銆銆33: EFLAG eflag; //!< the type of allocation
銆銆34:
銆銆35: private:
銆銆36: DISABLE_COPY_AND_ASSIGN(auto_free_ptr);
銆銆37: };
銆銆涓轟簡浣跨敤鏂逛究錛屽皝瑁呬袱涓畯錛?br />
銆銆1: // auto-free macros are mainly used to free the allocated memory by some local variables in the internal of function-body
銆銆2: #define AUTO_FREE_ENABLE( class, ptrName, ptrType ) \
銆銆3: auto_free_ptr auto_free_##ptrName; \
銆銆4: auto_free_##ptrName.set_ptr(&ptrName,auto_free_ptr::ptrType)
銆銆5:
銆銆6: #define AUTO_FREE_DISABLE( ptrName ) auto_free_##ptrName.give_up()
銆銆浣跨敤璧鋒潵寰堢畝鍗曪紝渚嬪
銆銆1: void func(int nLftCnt, int nRhtCnt)
銆銆2: {
銆銆3: if (!nLftCnt && !nRhtCnt)
銆銆4: return;
銆銆5:
銆銆6: unsigned *pLftHashs = NULL;
銆銆7: unsigned *pRhtHashs = NULL;
銆銆8:
銆銆9: //鍦ㄧ敵璇峰爢鍐呭瓨涔嬪墠錛屼嬌鐢╝uto_free_ptr
銆銆10: AUTO_FREE_ENABLE(unsigned, pLftHashs, new_array);
銆銆11: AUTO_FREE_ENABLE(unsigned, pRhtHashs, new_array);
銆銆12:
銆銆13: //....
銆銆14:
銆銆15: if (nLftCnt)
銆銆16: {
銆銆17: pLftHashs = new unsigned[nLftCnt];
銆銆18: //...a
銆銆19: }
銆銆20:
銆銆21: if (nRhtCnt)
銆銆22: {
銆銆23: pRhtHashs = new unsigned[nRhtCnt];
銆銆24: //...b
銆銆25: }
銆銆26:
銆銆27: //....
銆銆28:
銆銆29: if (...)
銆銆30: {
銆銆31: //鍥犱負涓嬮潰榪欎釜鍑芥暟鍙互閲婃斁璧勬簮錛屾墍浠ュ湪瀹冨墠闈㈡斁寮冨鐩爣鎸囬拡鐨勭鐞嗘潈
銆銆32: AUTO_FREE_DISABLE(pLftHashs);
銆銆33: AUTO_FREE_DISABLE(pRhtHashs);
銆銆34:
銆銆35: //榪欎釜鍑芥暟鍙互閲婃斁璧勬簮
銆銆36: free_hash_arrays(pLftHashs, pRhtHashs);
銆銆37: }
銆銆38: }
銆銆鍚屾牱鐨勶紝鏈夋椂鎴戜滑闇瑕佺敵璇蜂竴涓姩鎬佷簩緇存暟緇勶紝鎵浠ヤ篃瀹炵幇涓涓搴旂殑auto_free_2D_ptr
銆銆1: //auto_free_2D_ptr is only used for automation free memory of 2D array
銆銆2: template
銆銆3: class auto_free_2D_ptr
銆銆4: {
銆銆5: public:
銆銆6: typedef enum {invalid, new_one, new_array, alloc_mem} EFLAG;
銆銆7: auto_free_2D_ptr() { initialize(); }
銆銆8: ~auto_free_2D_ptr() { free_ptr(); }
銆銆9:
銆銆10: ///set the pointer needed to automatically free
銆銆11: inline void set_ptr( T** new_ptr_address,EFLAG new_eflag, int new_length_row )
銆銆12: { free_ptr(); p_ptr = new_ptr_address; eflag = new_eflag; length_row = new_length_row; }
銆銆13:
銆銆14: //give up auto free memory
銆銆15: inline void give_up() { initialize(); }
銆銆16:
銆銆17: protected:
銆銆18: inline void initialize() { p_ptr = NULL; eflag = invalid; length_row = 0;}
銆銆19: inline void free_ptr() throw()
銆銆20: {
銆銆21: if(!p_ptr || !(*p_ptr)) return;
銆銆22:
銆銆23: for(int i = 0; i < length_row; i++)
銆銆24: {
銆銆25: if(!(*p_ptr)[i]) continue;
銆銆26: switch(eflag)
銆銆27: {
銆銆28: case alloc_mem: { free((*p_ptr)[i]); break; }
銆銆29: case new_one: { delete (*p_ptr)[i]; break; }
銆銆30: case new_array: { delete[] (*p_ptr)[i]; break; }
銆銆31: }
銆銆32: (*p_ptr)[i] = NULL;
銆銆33: }
銆銆34: switch(eflag)
銆銆35: {
銆銆36: case alloc_mem: { free((*p_ptr)); break; }
銆銆37: default: { delete[] (*p_ptr); break; }
銆銆38: }
銆銆39: (*p_ptr) = NULL, p_ptr = NULL;
銆銆40: }
銆銆41:
銆銆42: protected:
銆銆43: T** p_ptr; //!< pointer to the address of the set pointer needed to automatically free
銆銆44: EFLAG eflag; //!< the type of allocation
銆銆45: int length_row; //!< the row length such as ptr[length_row][length_col]
銆銆46:
銆銆47: private:
銆銆48: DISABLE_COPY_AND_ASSIGN(auto_free_2D_ptr);
銆銆49: };
銆銆50:
銆銆51: #define AUTO_FREE_2D_ENABLE( class, ptrName, ptrType, rowNum ) \
銆銆52: auto_free_2D_ptr auto_free_##ptrName; \
銆銆53: auto_free_##ptrName.set_ptr(&ptrName,auto_free_2D_ptr::ptrType, rowNum)
銆銆54:
銆銆55: #define AUTO_FREE_2D_DISABLE( ptrName ) AUTO_FREE_DISABLE( ptrName )
銆銆涓嬮潰鏄釜渚嬪瓙
銆銆1: void func(int row, int col)
銆銆2: {
銆銆3: if (!row && !col)
銆銆4: return;
銆銆5:
銆銆6: int **ptr = new int*[ row ];
銆銆7: for( int r = 0; r < row; ++r ) { ptr[r] = new int[ col ];}
銆銆8:
銆銆9: AUTO_FREE_2D_ENABLE( int, ptr, new_array, row );
銆銆10:
銆銆11: //....
銆銆12: }
銆銆鍒拌繖閲屽氨緇撴潫浜嗭紝鏈変簺鐮佸弸鍙兘浼氳錛屼綍蹇呰繖涔堥夯鐑︼紝boost鍐呮湁寰堝鏅鴻兘鎸囬拡渚涢夋嫨錛岀敤share_ptr, scoped_ptr, scoped_array錛寀nique_ptr, auto_ptr 涓殑涓涓笉灝辮浜嗗悧? 娌¢敊!濡傛灉浣犳鍦ㄥ紑鍙戠殑浠g爜涓紝鍏佽鐢╞oost錛屽茍涓斿湪鐩稿叧紼嬪簭鎺ュ彛緇熶竴閮界敤鏅鴻兘鎸囬拡鏉ョ鐞嗐佷笉浼氱敤鍒版簮瀵硅薄鎸囬拡鐨勮瘽錛屽綋鐒朵紭鍏堥塨oost錛屼絾鏄綋浣犵殑浠g爜涓敱浜庡巻鍙插師鍥狅紝鏈変簺鎺ュ彛涓嶅彲鍙樻洿錛屼笖new/delete, malloc/free閮藉瓨鍦紝鑰屼笖渚濈劧闇瑕佷嬌鐢ㄦ簮瀵硅薄鎸囬拡鏉ュ畬鎴愬ぇ閮ㄥ垎宸ヤ綔鏃訛紝涓嶅Θ璇曡瘯鎴戣璁$殑榪欎釜闃夊壊鐗堢殑scoped_ptr/scoped_array銆傛諱箣錛屾牴鎹嚜宸辯殑瀹為檯鎯呭喌鏉ラ夋嫨鍚堥傜殑鏂規錛屽鏋滄爣鍑嗘柟妗堜笉閫傜敤錛屽氨鑷繁鍐欎竴涓?strong>鎵樼絳旀