簡介
臨時變量是在什么時候進行釋放的呢?
委員會將注意力集中到“語句結束位置”,很自然的,這種選擇被通俗地稱做 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++的設計與演化
