锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 璧勬簮鑾峰彇鍗沖垵濮嬪寲錛圧AII, Resource Acquisition Is Initialization錛夋槸鎸囷紝褰撲綘鑾峰緱涓涓祫婧愮殑鏃跺欙紝涓嶇榪欎釜璧勬簮鏄璞°佸唴瀛樸佹枃浠跺彞鏌勬垨鑰呭叾瀹冧粈涔堬紝浣犻兘浼氬湪涓涓璞$殑鏋勯犲嚱鏁頒腑鑾峰緱瀹冿紝騫朵笖鍦ㄨ瀵硅薄鐨勬瀽鏋勫嚱鏁頒腑閲婃斁瀹冦傚疄鐜拌繖縐嶅姛鑳界殑綾伙紝鎴戜滑灝辮瀹冮噰鐢ㄤ簡"璧勬簮鑾峰彇鍗沖垵濮嬪寲錛圧AII錛?鐨勬柟寮忋傝繖鏍風殑綾誨父甯歌縐頒負灝佽綾匯?/p> 鍙互渚濇嵁璧勬簮鍙彉鎬у拰璧勬簮鏉ユ簮榪欎袱涓壒寰侊紝鏉ュRAII榪涜鍒嗙被銆?/p> 濡傛灉涓涓皝瑁呯被瀵瑰叾瀹炰緥鎻愪緵棰濆鐨勫姛鑳斤紝浣垮緱鍏跺疄渚嬭兘琚祴浜堟柊璧勬簮錛岃繖涓被琛ㄧ幇鍑虹殑榪欑鐗瑰緛鍗崇О涓?鍙彉鐨凴AII"錛屽惁鍒欏氨鏄?涓嶅彲鍙樼殑RAII"銆?/p> 涓嶅彲鍙樼殑RAII錛屾槸浣跨敤璧鋒潵鏈綆鍗曠殑涓縐嶃傝瀹冪畝鍗曪紝鏄洜涓哄湪榪欑鎯呭喌涓嬶紝鏃犻渶鍦ㄥ皝瑁呯被涓彁渚涚敤浜庢寚瀹氳祫婧愮殑鏂規硶--涓嶇鏄柊鍒嗛厤鐨勮祫婧愶紝榪樻槸瀵瑰叾浠栬祫婧愯繘琛屾嫹璐濄傝繖縐峈AII榪樻剰鍛崇潃錛岀被鐨勬瀽鏋勫嚱鏁版繪槸鍙互鍋囧畾錛岃灝佽鐨勮祫婧愭槸鏈夋晥鐨勩?/p> 涓庢鐩稿弽錛屾彁渚涘彲鍙樼殑RAII鐨勭被錛屽氨闇瑕佸疄鐜頒笅鍒楀姛鑳戒腑鐨勭粷澶ч儴鍒嗭紝鎴栬呭叏閮細緙虹渷鐨勬垨鑰呯┖鐨勬瀯閫犲嚱鏁幫紝鎷瘋礉鏋勯犲嚱鏁幫紝鎷瘋礉璧嬪兼搷浣滐紝鐢ㄤ簬鎸囧畾璧勬簮鐨勬柟娉曘傛渶閲嶈鐨勬槸錛岃繖鏍風殑綾誨湪鏋愭瀯鍑芥暟鍜屼換浣曠被浼糲lose()鐨勬柟娉曚腑錛岄噴鏀捐祫婧愬墠錛岄兘蹇呴』媯嫻嬭灝佽鐨勮祫婧愭槸涓嶆槸null銆?/p> 瀵逛簬鎻愪緵RAII鐨勭被鏉ヨ錛岀浜屼釜閲嶈鐨勭壒寰佹槸錛屽畠浠氳繃浠涔堥斿緞鑾峰彇鑷繁鎵綆$悊鐨勮祫婧愩備互std::string涓轟唬琛ㄧ殑綾伙紝浣跨敤鐨勬槸鍐呴儴鍒濆鍖栫殑RAII錛氬畠綆$悊鐨勮祫婧?-鍗沖唴瀛樹腑鐢ㄤ簬淇濆瓨瀛楃鐨勭紦鍐插尯--鏄敱瀹冭嚜宸卞垱寤虹殑錛岃繖涓璧勬簮瀵瑰姘歌繙鏄笉鍙鐨勩備笌姝や笉鍚岀殑鏄紝浠td::auto_ptr涓轟唬琛ㄧ殑綾昏〃鐜板嚭澶栭儴鍒濆鍖栫殑RAII琛屼負錛氬畠鎵綆$悊鐨勮祫婧愶紝鏄嬌鐢ㄥ畠鐨勫鎴風▼搴忥紙閫氳繃鍙﹀鐨勬煇縐嶆柟寮忚幏寰椾箣鍚庯級浜ょ粰瀹冪殑銆?/p> 鍐呴儴鍒濆鍖栫殑RAII鐨勫皝瑁呯被錛屼竴鑸瘮杈冨鏄撳疄鐜幫紝浣嗘槸鍔熻兘涓婁篃姣旇緝鍙楅檺鍒訛紝鍥犱負瀹冧滑鑾峰彇璧勬簮鐨勬満鍒舵槸棰勫厛瀹氫箟濂界殑錛屽茍涓旀槸鍥哄畾涓嶅彉鐨勩備笉榪囷紝榪欐牱鐨勭被鐢ㄨ搗鏉ヤ篃瀹規槗涓浜涳紝鎴栬呰錛屾瘮杈冮毦琚鐢細鍥犱負瀹㈡埛浠g爜鍑犱箮娌℃湁鏈轟細鐘笅鑳藉鑷磋祫婧愭硠闇茬殑閿欒銆?/p>
RAII錛氳祫婧愯幏鍙栧嵆鍒濆鍖?/h1>
璧勬簮鍙彉鎬?/h2>
璧勬簮鏉ユ簮
class base

{
public:
base()
{};
~base()
{};

virtual void func1()
{printf("base::func1\r\n");};
virtual void func2()
{printf("base::func2\r\n");};
int ma;
int mb;
void member_func()
{printf("base::member_func\r\n");}
};
class derive : public base

{
public:
derive()
{};
~derive()
{};

virtual void func1()
{printf("derive::func1\r\n");};
virtual void func3()
{printf("derive::func3\r\n");};
virtual void func4()
{printf("derive::func4\r\n");};
int ma2;
int mb2;

void member_func2()
{printf("derive::member_func2\r\n");}
};
class derive2 : public derive

{
public:
derive2()
{};
~derive2()
{};

virtual void func3()
{printf("derive2::func3\r\n");};
virtual void func4()
{printf("derive2::func4\r\n");};
virtual void func5()
{printf("derive2::func5\r\n");};
int ma3;
int mb3;

void member_func3()
{printf("derive2::member_func3\r\n");}
};
int _tmain(int argc, _TCHAR* argv[])

{
typedef void (*Fun)(void);
Fun pfun = 0;
derive2* d2 = new derive2;
int* p = (int*)d2;
*(p+1) = 20;
*(p+2) = 30;
*(p+3) = 200;
*(p+4) = 300;
*(p+5) = 2000;
*(p+6) = 30000;
for (int i = 0; i<5; i++)
{
Fun pfun = (Fun)*((int*)*(p+0)+i);
if (pfun)
pfun();
else
printf("null\r\n");
}
base* b2 = new derive;
int* p2 = (int*)b2;
pfun = (Fun)*((int*)*(p2+0)+3);
pfun();
return 0;
}