当临时对象由(另一个)函数创建然后返回时,我不知道调用临时对象的成员函数是否安全.
以下是一个例子:
string getString(const string &str)
{
string tempStr = str + str;
return tempStr;
}
int main()
{
if(getString("aaaaa").compare("bbbb") == 0) { // is it safe?
// do something
}
}
Run Code Online (Sandbox Code Playgroud)
我也做了如下的终身测试.
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;
}
Run Code Online (Sandbox Code Playgroud)
结果:
Foo :: Foo():0x7fff4d03d3bf
void Foo :: show():0x7fff4d03d3bf
Foo :: ~Foo():0x7fff4d03d3bf
似乎析构函数将在成员函数完成后启动.但它取决于编译器吗?
PS:我使用的编译器是g ++ v 5.3.1谢谢
由按函数返回对象的函数的return语句创建的临时对象至少存在,直到调用该函数的整个语句完成为止.所以这是安全的.
tempStr由于返回值优化,您没有看到被破坏.但是,即使tempStr被破坏,代码仍然是100%安全的,因为您访问的临时文件不是 tempStr由值返回创建的临时文件.