C++ 臨時變量的釋放規則


簡介

臨時變量是在什么時候進行釋放的呢?
委員會將注意力集中到“語句結束位置”,很自然的,這種選擇被通俗地稱做 EOS (End Of Statement) 。問題是如何精確定義 EOS 的意義。
測試程序

#include "iostream"
#include <string>
using namespace std;

int main(){
    string s1 = "111";
    string s2 = "222";
    char *q = nullptr;
    {
        const char *p = (s1 + s2).c_str();
        q = (char *)p;
    }
    printf("%s", q);
    printf("%s", (s1 + s2).c_str());
}

發現編譯器有點智能關於 p 所指向的內存區域(臨時變量)邏輯上會在大括號結束的時候就被釋放,可能是因為我的q所指向這個區域,這個區域暫時沒有得到釋放。


書中提到的例子,現在的編譯器可以做到更智能。舊版本的C要求變量的定義一定要在開頭,也是因為編譯器不夠智能,或者標准不夠智能導致的問題。

void f(String si, String s2void f(String si, String s2)
{
printf(" %s" ,sl+s2); // ok
const char*
printf( ” %s" ,p); // won’t work, temporary destroyed
sl+s2;
String s3
printf(" %s" ,(const char*)s3); / / ok
sl+s2
cout << s3; / / ok
cout << sl+s2; / / ok    
}

參考資料

book C++的設計與演化


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM