一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

聊聊C++臨時(shí)對(duì)象的析構(gòu)時(shí)間點(diǎn)

 torony 2015-12-31

       C++臨時(shí)對(duì)象的析構(gòu)?這不是很簡(jiǎn)單么?其實(shí)沒那么簡(jiǎn)單。 我們先看看如下程序吧:

  1. #include <iostream>  
  2. #include <string>  
  3. using namespace std;  
  4.   
  5. string test()  
  6. {  
  7.     return "abc";  
  8. }  
  9.   
  10. int main()  
  11. {  
  12.     const char *p = test().c_str();  
  13.     cout << p << endl;  
  14.   
  15.     return 0;  
  16. }  
        你可能迫切地期待結(jié)果為:abc, 其實(shí)不然。 為了簡(jiǎn)便起見, 我們簡(jiǎn)化一下上述程序:

  1. #include <iostream>  
  2. #include <string>  
  3. using namespace std;  
  4.   
  5. int main()  
  6. {  
  7.     const char *p = string("abc").c_str();  
  8.     cout << p << endl;  
  9.   
  10.     return 0;  
  11. }  
       注意, 結(jié)果不是abc. 為什么呢? 我先直接說吧:string("abc")是一個(gè)臨時(shí)對(duì)象, 在執(zhí)行完const char *p = string("abc").c_str();這個(gè)語句后, 臨時(shí)對(duì)象就析構(gòu)了, 也就是說p指向的區(qū)域中的值變了。 所以, 結(jié)果自然不是abc.


       這就引出了如下問題: 臨時(shí)對(duì)象是何時(shí)析構(gòu)的呢? 我們先看一個(gè)程序:

  1. #include <iostream>  
  2. #include <string>  
  3. using namespace std;  
  4.   
  5. class A  
  6. {  
  7. public:  
  8.     A()  
  9.     {  
  10.         cout << "A constructor" << endl;  
  11.     }  
  12.   
  13.     ~A()  
  14.     {  
  15.         cout << "A destructor" << endl;  
  16.     }  
  17. };  
  18.   
  19. int main()  
  20. {  
  21.     A(); // 臨時(shí)對(duì)象  
  22.   
  23.     printf("end xxx\n");  
  24.     printf("end yyy\n");  
  25.   
  26.     return 0;  
  27. }  
      稍微懂一點(diǎn)C++的人會(huì)說, 結(jié)果是:

A constructor
end xxx
end yyy
A destructor

      其實(shí), 上述結(jié)果是錯(cuò)誤的, 真正的結(jié)果是:

A constructor
A destructor
end xxx
end yyy

     

       看來, 在執(zhí)行完第一個(gè)語句后, 臨時(shí)對(duì)象A()就析構(gòu)了, 我們來看看匯編, 驗(yàn)證一下吧:


        我們看到, 臨時(shí)對(duì)象確實(shí)是在printf之前析構(gòu)的。


        好, 我們接著看:

  1. #include <iostream>  
  2. #include <string>  
  3. using namespace std;  
  4.   
  5. class A  
  6. {  
  7. public:  
  8.     A()  
  9.     {  
  10.         cout << "A constructor" << endl;  
  11.     }  
  12.   
  13.     ~A()  
  14.     {  
  15.         cout << "A destructor" << endl;  
  16.     }  
  17. };  
  18.   
  19. int main()  
  20. {  
  21.     A(), // 注意, 是逗號(hào)運(yùn)算符  
  22.     printf("end xxx\n");  
  23.     printf("end yyy\n");  
  24.   
  25.     return 0;  
  26. }  
      運(yùn)行結(jié)果為:

A constructor
end xxx
A destructor
end yyy


      不要驚訝, 查看匯編代碼就知道, 臨時(shí)對(duì)象是在 printf("end xxx\n");后析構(gòu)的。


      繼續(xù)看代碼:

  1. #include <iostream>  
  2. #include <string>  
  3. using namespace std;  
  4.   
  5. class A  
  6. {  
  7. public:  
  8.     A()  
  9.     {  
  10.         cout << "A constructor" << endl;  
  11.     }  
  12.   
  13.     ~A()  
  14.     {  
  15.         cout << "A destructor" << endl;  
  16.     }  
  17. };  
  18.   
  19. int main()  
  20. {  
  21.     A(), // 注意, 是逗號(hào)運(yùn)算符  
  22.     printf("end xxx\n"), // 注意, 是逗號(hào)運(yùn)算符  
  23.     printf("end yyy\n");  
  24.   
  25.     return 0;  
  26. }  
      運(yùn)行結(jié)果為:

A constructor
end xxx
end yyy
A destructor

       不要驚訝, 查看匯編代碼就知道, 臨時(shí)對(duì)象是在 printf("end xxx\n");后析構(gòu)的。


       由此可見, 臨時(shí)對(duì)象是在遇到其后的第一個(gè)分號(hào)(語句結(jié)束處)析構(gòu)的。


        好, 我們?cè)倏纯矗?/p>

  1. #include <iostream>  
  2. #include <string>  
  3. using namespace std;  
  4.   
  5. int main()  
  6. {  
  7.     const char *p = string("abc").c_str(); // 臨時(shí)對(duì)象在執(zhí)行完該句后析構(gòu)了  
  8.     cout << p << endl; // 此時(shí)p指向垃圾值  
  9.   
  10.     return 0;  
  11. }  
       一切一目了然。


       大家在使用臨時(shí)對(duì)象的時(shí)候要留個(gè)心眼, 尤其是使用string的c_str時(shí), 一旦出錯(cuò), 經(jīng)常排查半天, 最后才發(fā)現(xiàn)栽倒在此處。 鑒于容易出錯(cuò), 最后, 我們?cè)倏匆谎郯桑?/p>

  1. #include <iostream>  
  2. #include <string>  
  3. using namespace std;  
  4.   
  5. int main()  
  6. {  
  7.     const char *p = (string("abc") + string("def")).c_str(); // 臨時(shí)對(duì)象在執(zhí)行完該句后析構(gòu)了  
  8.     cout << p << endl; // 此時(shí)p指向垃圾值  
  9.   
  10.     return 0;  
  11. }  

      OK,  本文先到此為止。


       備注: 在上面的程序中, 我使用的編譯器是VC++6.0, 后來網(wǎng)友“時(shí)光”提醒我, g++的編譯器會(huì)有不同的表現(xiàn)。 在此, 感謝“時(shí)光”得意。 另外, 為了寫出高質(zhì)量的可移植代碼, 仍需要注意避免使用臨時(shí)string對(duì)象的c_str方法。



    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    人妻少妇久久中文字幕久久| 免费性欧美重口味黄色| 日韩欧美综合中文字幕| 国产又猛又黄又粗又爽无遮挡| 精品一区二区三区中文字幕| 国产熟女一区二区不卡| 国产欧美日韩精品自拍| 年轻女房东2中文字幕| 在线懂色一区二区三区精品| 久久精品少妇内射毛片| 国产一级不卡视频在线观看| 黄色三级日本在线观看| 国产福利在线播放麻豆| 好吊日在线观看免费视频| av一区二区三区天堂| 亚洲欧美中文日韩综合| 亚洲国产成人久久99精品| 欧美国产日产在线观看| 国产又粗又猛又爽又黄| 国产成人精品视频一二区| 国产一区二区三区午夜精品| 黄色片一区二区三区高清| 精品少妇一区二区视频| 开心五月激情综合婷婷色| 嫩草国产福利视频一区二区| 日本东京热加勒比一区二区| 婷婷九月在线中文字幕| 欧美多人疯狂性战派对| 色一欲一性一乱—区二区三区| 加勒比东京热拍拍一区二区| 婷婷色网视频在线播放| 国产专区亚洲专区久久| 亚洲欧美日韩综合在线成成| 亚洲国产综合久久天堂| 国内胖女人做爰视频有没有| 欧美成人免费夜夜黄啪啪| 亚洲欧美天堂精品在线| 国产亚州欧美一区二区| 国产中文字幕一区二区| 老富婆找帅哥按摩抠逼视频| 精品国产日韩一区三区|