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++的设计与演化

原文地址:https://www.cnblogs.com/eat-too-much/p/14321085.html