【发布时间】:2017-12-11 02:42:57
【问题描述】:
有一天,我想知道返回字符串对象时是否存在内存副本。但是,我发现了一件奇怪的事情。当我在函数中返回一个对象时,我希望有一个复制构造来创建一个临时对象作为返回值。所以,我尝试下面的代码。
class Substring: public string
{
public:
Substring(const char* s)
:string(s)
{
}
~Substring()
{
cout << "Deconstruct" << endl;
}
};
Substring foo()
{
Substring ret("test");
printf("Inner address: %p\n", ret.c_str());
return ret;
}
int main()
{
Substring test = foo();
printf("Return address: %p\n", test.c_str());
return 0;
}
正如我所说,我期待Return address 与Inner address 不同。并且Deconstruct 应该在Inner address 之后打印出来
这是我得到的。当外部变量test 死亡时,ret 似乎被解构,而不是超出其范围的时间!为什么?
Inner address: 0x7ffed3a4cb40
Return address: 0x7ffed3a4cb40
Deconstruct
【问题讨论】:
-
如果想看可以关掉RVO:stackoverflow.com/questions/8758152/…
-
@JerryJeremiah 谢谢!
标签: c++