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的总结:这种现象以前遇到过,好像是郑胜松提供的解决方案,就是先引用它,就可以延长函数返回值临时变量的生命周期。