一个引用相关问题,延长临时变量的生命周期
来源:互联网 发布:叫停互联网医院 知乎 编辑:程序博客网 时间:2024/05/22 01:52
string fun()
{
return "some";
}
///////
情况一
////
const char* c = fun().c_str();
//////
情况二
string& str = fun();
const char* c = str.c_str();
///实验结果
情况一
c中存""
情况二
c中存"some"
why?
现在加了第四种情况,
string* str = &fun();
const char* c = str.c_str();
/////////////////////////////////
请注意,这回fun返回的临时的string就马上析构了,刚刚查了一下资料,总结了一点规律,跟大家分享一下。
1. 这种函数返回的值是一个临时变量,这个临时变量的生命周期一直到执行完调用该函数这条语句,
例如,情况1,情况3,情况4:
const char* c = fun().c_str();
fun2(fun().c_str());
string* str = &fun();
执行完这条语句之后这个临时变量就该析构了。
2. 当有一个引用引用这个临时变量的话,就不会再析构这个临时变量,从而延长了这个临时变量的生命周期。也就是第二种情况,它会一直到这个引用所在栈析构的时候一起析构。
那么,为什么会存在上面所说的第2条规律呢,我想应该跟C++中对引用所定义的规则有关系,
我们不可以单独声明一个引用
int& i;// error
我们必须引用一个存在的对象,也就是说C++中定义引用必须是有意义的,你可以想方设法用任何方式引用一个不存在的对象compiler的语法检查都会告诉你。函数返回值对引用的“特别待遇”也是为了维护这个规则,它不允许引用一个不存在的对象,而这种情况语法上是合理的,那么只有定义一个特别的规则,就是如果引用返回值临时变量就把这个临时变量的生存周期延长。(即为了维护引用必须引用一个存在的对象这个规则,当有引用指向一个临时对象时,这个临时对象的生命周期必须得一直延长到引用它的变量失效。string& str = string("123") + string("456");和string& str = fun();一样的道理,都是临时变量)
backard的总结:这种现象以前遇到过,好像是郑胜松提供的解决方案,就是先引用它,就可以延长函数返回值临时变量的生命周期。
{
return "some";
}
///////
情况一
////
const char* c = fun().c_str();
//////
情况二
string& str = fun();
const char* c = str.c_str();
///实验结果
情况一
c中存""
情况二
c中存"some"
why?
现在加了第四种情况,
string* str = &fun();
const char* c = str.c_str();
/////////////////////////////////
请注意,这回fun返回的临时的string就马上析构了,刚刚查了一下资料,总结了一点规律,跟大家分享一下。
1. 这种函数返回的值是一个临时变量,这个临时变量的生命周期一直到执行完调用该函数这条语句,
例如,情况1,情况3,情况4:
const char* c = fun().c_str();
fun2(fun().c_str());
string* str = &fun();
执行完这条语句之后这个临时变量就该析构了。
2. 当有一个引用引用这个临时变量的话,就不会再析构这个临时变量,从而延长了这个临时变量的生命周期。也就是第二种情况,它会一直到这个引用所在栈析构的时候一起析构。
那么,为什么会存在上面所说的第2条规律呢,我想应该跟C++中对引用所定义的规则有关系,
我们不可以单独声明一个引用
int& i;// error
我们必须引用一个存在的对象,也就是说C++中定义引用必须是有意义的,你可以想方设法用任何方式引用一个不存在的对象compiler的语法检查都会告诉你。函数返回值对引用的“特别待遇”也是为了维护这个规则,它不允许引用一个不存在的对象,而这种情况语法上是合理的,那么只有定义一个特别的规则,就是如果引用返回值临时变量就把这个临时变量的生存周期延长。(即为了维护引用必须引用一个存在的对象这个规则,当有引用指向一个临时对象时,这个临时对象的生命周期必须得一直延长到引用它的变量失效。string& str = string("123") + string("456");和string& str = fun();一样的道理,都是临时变量)
backard的总结:这种现象以前遇到过,好像是郑胜松提供的解决方案,就是先引用它,就可以延长函数返回值临时变量的生命周期。
- 一个引用相关问题,延长临时变量的生命周期
- C++临时变量的生命周期(const 引用后延长临时变量周期)
- C++临时变量的生命周期
- C++临时变量的生命周期
- C++临时变量的生命周期
- C++临时变量的生命周期
- C++临时变量的生命周期
- 对临时变量的引用
- 返回临时变量的引用
- 了解临时对象的来源 (深刻理解为什么不能返回一个临时变量的引用)
- 返回一个临时变量的右值引用,那么临时对象什么时候释放?
- 变量地址生命周期的一个问题
- 为什么不能从子函数中返回临时对象的指针和引用,却可以返回一个临时变量的值
- return临时变量的问题
- 关于引用临时变量
- NSOperationQueue没有必要反复创建临时变量,可以使用一个强引用的NSOperationQueue
- 临时对象生命周期问题
- C++ 临时变量做函数参数时的生命周期
- c#通过ODBC数据源连接Mysql数据库
- gTar:用手中的iPhone也能玩出吉他效果
- #import 与 #include的区别,以及 @class
- 常用的APT命令参数
- 发布C#版本 图片批量追加水印工具
- 一个引用相关问题,延长临时变量的生命周期
- 测肺活量可以用手机 SpiroSmart将音频转为风量
- Subversion安装配置教程
- 一个解决绘图闪动的经验
- iPhone音乐软件Jam:美国版“唱吧”
- 各反对赛得分机会进
- MFC中经常出错的地方
- sql中文乱码解决
- 【Oracle】集合(联合数组(索引表),嵌套表,变长数组,记录类型的嵌套表)的初始化与赋值,以及它们的区别