我不知道当临时对象是由(另一个)函数创建然后返回时,调用临时对象的成员函数是否安全。
以下是一个例子:
string getString(const string &str)
{
string tempStr = str + str;
return tempStr;
}
int main()
{
if(getString("aaaaa").compare("bbbb") == 0) { // is it safe?
// do something
}
}
我也会进行终身测试。
class Foo
{
public:
Foo()
{
cout << __PRETTY_FUNCTION__ << " :" << this << endl;
}
~Foo()
{
cout << __PRETTY_FUNCTION__ << " :" << this << endl;
}
void show()
{
cout << this << endl;
}
};
Foo func(void)
{
return Foo();
}
int main()
{
func().show();
return 0;
}
结果:
Foo :: Foo():0x7fff4d03d3bf
void Foo :: show():0x7fff4d03d3bf
Foo :: ~Foo():0x7fff4d03d3bf
似乎析构函数将在成员函数完成后启动。 但它取决于编译器吗?
PS:我使用的编译器是g ++ v 5.3.1 感谢
答案 0 :(得分:9)
由按函数返回对象的函数的return语句创建的临时对象至少存在,直到调用该函数的整个语句完成为止。所以这是安全的。
由于返回值优化,您没有看到tempStr
被销毁。但是,即使tempStr
被销毁,代码仍然是100%安全的,因为您访问的临时不是 tempStr
,而是由值返回创建的。