简介

临时变量是在什么时候进行释放的呢?

委员会将注意力集中到“语句结束位置”,很自然的,这种选择被通俗地称做 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++的设计与演化

C++ 临时变量的释放规则的更多相关文章

  1. C++11引用临时变量的终极解析

    工作中遇到一个引用临时变量的问题,经过两天的学习,私以为:不仅弄明白了这个问题,还有些自己的独到见解. 这里使用一个简单的例子来把自己的学习过程和理解献给大家,如果有什么问题请不吝指正.   **** ...

  2. c++ 临时变量

    C++的临时变量 它们是被神所遗弃的孩子,没有人见过它们,更没有人知道它们的名字.它们命中注定徘徊于命运边缘高耸的悬崖和幽深的深渊之间,用自己短暂的生命抚平了生与死之间的缝隙.譬如朝露,却与阳光无缘. ...

  3. 临时变量不能作为非const引用

    转自:http://blog.csdn.net/u011068702/article/details/64443949 1.看代码 2.编译结果 3.分析和解决 就拿f(a + b)来说,a+b的值会 ...

  4. 代码重构与单元测试——使用“以查询取代临时变量”再次对Statement()方法进行重构(七)

    代码重构与单元测试(一) 代码重构与单元测试--测试项目(二) 代码重构与单元测试--"提取方法"重构(三) 代码重构与单元测试--重构1的单元测试(四) 代码重构与单元测试--对 ...

  5. python 临时变量使用心得

    在函数里面的临时变量也可以定义为一个函数名.变量名,这样就可以通过对象来访问这个变量了,函数使用完之后不会消除.因为函数也是对象,python里面一切皆为对象.

  6. 临时变量不能作为非const类型引用形参的实参

    摘要:     非const 引用形参只能与完全同类型的非const对象关联.      具体含义为:(1)不能用const类型的对象传递给非const引用形参:                  ( ...

  7. C++临时变量的生命周期

    C++ 中的临时变量指的是那些由编译器根据需要在栈上产生的,没有名字的变量.主要的用途主要有两类: 1) 函数的返回值, 如: string proc() { return string(" ...

  8. Mysql 临时变量的 定义 和 赋值 Set 和 Into 赋值; Swith Mysql版本 Case When的用法

    一:临时变量的定义和赋值 DECLARE spot SMALLINT; -- 分隔符的位置 DECLARE tempId VARCHAR(64); -- 循环 需要用到的临时的Cid DECLARE ...

  9. [转] C++临时变量的生命周期

    http://www.cnblogs.com/catch/p/3251937.html C++中的临时变量指的是那些由编译器根据需要在栈上产生的,没有名字的变量. 主要的用途主要有两类: 1) 函数的 ...

  10. linq中的临时变量

    有一个字符串数组: string[]arrStr={"123","234","345","456"}; 现在想得到该数组 ...

随机推荐

  1. 🎀dubbo 2.7.2 启动报错【Unsupported generic type false】排查

    1.问题现象 dubbo服务启动时抛出异常Unsupported generic type false,但不影响服务正常发布. Caused by: java.lang.IllegalArgument ...

  2. 几种JAVA表达式语言计算工具

    测试表达式工具分类 这里测试了几种方式,MS excel,Spring SEPL,MVEL,Google aviator import com.googlecode.aviator.AviatorEv ...

  3. MySQL 中 EXISTS 和 IN 的区别是什么?

    在 MySQL 中,EXISTS 和 IN 都用于在子查询中进行条件判断,但它们的使用场景和性能有一定区别.以下是 EXISTS 和 IN 的主要区别: 1. 功能和用法 EXISTS: EXISTS ...

  4. easy-query隐式Group革命性OLAP优化JAVA下最强查询ORM没有之一子查询合并

    easy-query JAVA下最强查询ORM没有之一的任意子查询合并革命性OLAP优化 前言 对于大部分OLTP而言的查询市面上常见的orm已经能很好的处理,只要建立好对象关系那么就可以非常简单的实 ...

  5. 聊聊SpringAI流式输出的底层实现?

    在 Spring AI 中,流式输出(Streaming Output)是一种逐步返回 AI 模型生成结果的技术,允许服务器将响应内容分批次实时传输给客户端,而不是等待全部内容生成完毕后再一次性返回. ...

  6. 二、C语言基础知识

    声明 本文内容大多取自<高级语言程序设计一书>,为本人学习笔记记录,切勿用于商业用途. 第一节 C 语言发展和特点 C 语言是当今最流行的计算机语言之一,是一种结构化的高级语言. 一.C ...

  7. 【记录】Samba|Windows 11的Samba连接切换用户

    Samba是一个用于共享文件和打印机的网络协议,可以使不同的操作系统之间共享文件和资源变得容易.在Windows 11上,可以使用Samba来连接到网络共享. 如果您想在Windows 11上切换用户 ...

  8. 在rk3588上部署InternVL系列

    在rk3588上部署InternVL2-1B 准备 首先要在hf上下载InternVL2-1B的模型传送门(镜像) git clone https://hf-mirror.com/OpenGVLab/ ...

  9. K8s新手系列之Service资源

    概述 官方文档:https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/ 在kubernetes中,pod是应用程序 ...

  10. vue3 基础-API-watch 和 watchEffect

    前篇对 computed 属性如何在 api 中基本使用, 即从 vue 中引入, 然后通过直接传函数或者传对象的方式, 开箱即用, 非常清晰易懂. 本篇继续来对之前的 watch 进行扩展使用啦. ...