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++的设计与演化
C++ 临时变量的释放规则的更多相关文章
- C++11引用临时变量的终极解析
工作中遇到一个引用临时变量的问题,经过两天的学习,私以为:不仅弄明白了这个问题,还有些自己的独到见解. 这里使用一个简单的例子来把自己的学习过程和理解献给大家,如果有什么问题请不吝指正. **** ...
- c++ 临时变量
C++的临时变量 它们是被神所遗弃的孩子,没有人见过它们,更没有人知道它们的名字.它们命中注定徘徊于命运边缘高耸的悬崖和幽深的深渊之间,用自己短暂的生命抚平了生与死之间的缝隙.譬如朝露,却与阳光无缘. ...
- 临时变量不能作为非const引用
转自:http://blog.csdn.net/u011068702/article/details/64443949 1.看代码 2.编译结果 3.分析和解决 就拿f(a + b)来说,a+b的值会 ...
- 代码重构与单元测试——使用“以查询取代临时变量”再次对Statement()方法进行重构(七)
代码重构与单元测试(一) 代码重构与单元测试--测试项目(二) 代码重构与单元测试--"提取方法"重构(三) 代码重构与单元测试--重构1的单元测试(四) 代码重构与单元测试--对 ...
- python 临时变量使用心得
在函数里面的临时变量也可以定义为一个函数名.变量名,这样就可以通过对象来访问这个变量了,函数使用完之后不会消除.因为函数也是对象,python里面一切皆为对象.
- 临时变量不能作为非const类型引用形参的实参
摘要: 非const 引用形参只能与完全同类型的非const对象关联. 具体含义为:(1)不能用const类型的对象传递给非const引用形参: ( ...
- C++临时变量的生命周期
C++ 中的临时变量指的是那些由编译器根据需要在栈上产生的,没有名字的变量.主要的用途主要有两类: 1) 函数的返回值, 如: string proc() { return string(" ...
- Mysql 临时变量的 定义 和 赋值 Set 和 Into 赋值; Swith Mysql版本 Case When的用法
一:临时变量的定义和赋值 DECLARE spot SMALLINT; -- 分隔符的位置 DECLARE tempId VARCHAR(64); -- 循环 需要用到的临时的Cid DECLARE ...
- [转] C++临时变量的生命周期
http://www.cnblogs.com/catch/p/3251937.html C++中的临时变量指的是那些由编译器根据需要在栈上产生的,没有名字的变量. 主要的用途主要有两类: 1) 函数的 ...
- linq中的临时变量
有一个字符串数组: string[]arrStr={"123","234","345","456"}; 现在想得到该数组 ...
随机推荐
- 张高兴的大模型开发实战:(五)使用 LLaMA Factory 微调与量化模型并部署至 Ollama
目录 环境搭建与配置 数据集准备 WebUI 配置微调参数 模型导出与量化 导入 Ollama LLaMA Factory 是一个开源的全栈大模型微调框架,简化和加速大型语言模型的训练.微调和部署流程 ...
- kettle介绍-Step之Value Mapper
Value Mapper值映射介绍 值映射步骤是将字符串值从一个值映射为另一个值.值映射步骤提供了一个简单的替代方法,在输入流中选中一个字段,通过字段值设置源值和目标值,再将映射值输出给后续步骤使用. ...
- cocos3.x creator常见问题及解决办法
原文地址: cocos3.x creator剪切.动画.物理引擎.碰撞检测等常见问题及解决办法 - 搜栈网 (seekstack.cn)https://www.seekstack.cn/post/4 ...
- 解密prompt系列53. 再谈大模型Memory
上一章畅想里面我们重点提及了大模型的记忆模块,包括模型能否持续更新记忆模块,模型能否把持续对记忆模块进行压缩更新在有限的参数中存储更高密度的知识信息,从而解决有限context和无限知识之间的矛盾.这 ...
- C#自动属性提供默认值的方法
编程之路转自:cjavapy.com/article/55/ _ .NET(C#)中,自动属性(Auto-Implemented Properties)提供了一种简洁的方式来实现属性而无需显式定义字 ...
- 北京市第六届信息通信行业网络安全技能大赛(初赛)-CTF夺旗阶段 EZRSA writeup
题目EZRSA EZRSA.py from Crypto.Util.number import * import gmpy2 from flag import m p = getPrime(1024) ...
- 基于口令的密码—PBE
目录 流程 加密流程 解密流程 盐的作用 通过拉伸来改良PBE的安全性 如何生成安全口令的建议 定义: PBE是一种根据口令生成密钥并用该密钥进行加密的方法. 加密和解密都使用同一个密钥. 口令一词多 ...
- 自定义工具类之”判断两个集合中是否有一个相同的值-》CollectionUtils.containsAny(集合1,集合2)“
判断两个集合中是否有一个相同的值 CollectionUtils.containsAny(集合1,集合2)就可以满足以下条件 两个集合中,只要有一个值相同就直接返回true 如:集合1:"1 ...
- DeepSeek+Coze实战:从0到1搭建小红书图文改写智能体(喂饭级教程)
大家好,我是汤师爷,专注AI智能体分享~ 还在为小红书笔记创作发愁吗? 每天都要绞尽脑汁想文案,看着别人的爆款笔记却不知道如何模仿? 今天,我就教你如何利用AI智能体,轻松实现小红书图文改写,让创作效 ...
- docker中源码安装onnx / tvm
docker安装 可自行到https://tvm.apache.org/docs/install/docker.html 官网下载安装 环境: 系统: ubuntu22.04系统, docker版本: ...