zoukankan      html  css  js  c++  java
  • 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++的设计与演化

  • 相关阅读:
    ubuntu安装Theano+cuda
    Deep Learning 学习笔记(9):主成分分析( PCA )与 白化( whitening )
    php 基础知识
    php 常用函数
    mysql 学习碎片
    Linux 学习碎片
    php 碎片笔记
    网络资源收集
    php 设计模式
    php 图片添加文字水印 以及 图片合成(微信快码传播)
  • 原文地址:https://www.cnblogs.com/eat-too-much/p/14321085.html
Copyright © 2011-2022 走看看