gpt4 book ai didi

c++ - 为什么这个方法的返回被破坏了?

转载 作者:太空狗 更新时间:2023-10-29 23:48:41 26 4
gpt4 key购买 nike

#include<iostream>
using namespace std;
class mini
{
public:
mini() { cout << "mini()"; }
~mini() { cout << "~mini()"; }
};
class test
{
public:
mini ret()
{
return *(new mini());
}
};
int main()
{
test a;
a.ret();
cout << "end of block";
}

输出:

mini()~mini()end of block

为什么 ~mini() 在 block 结束之前在这里运行?或者更确切地说,如果我将方法的输出更改为 mini* 那么它就不会被删除。我知道堆栈对象确实会被删除,但我是新来的。

最佳答案

想想这里发生了什么

  mini ret()
{
return *(new mini());
}

ret() 是一个按值返回 mini 的函数。

new mini() 在堆上分配 minireturn *(new mini()); 按值返回它的一个拷贝。因此,打印的是 mini 在堆上的构造以及在调用 ret() 的完整表达式末尾在堆栈上对其拷贝的销毁。

为了可视化它,实现一个复制构造函数:

#include<iostream>
using namespace std;
class mini
{
public:
mini() { cout << "mini()\n"; }
mini(const mini&) { cout << "mini() copy\n"; }
~mini() { cout << "~mini()\n"; }
};
class test
{
public:
mini ret()
{
return *(new mini());
}
};
int main()
{
test a;
a.ret();
cout << "end of block\n";
}

打印

mini()
mini() copy
~mini()
end of block

所以你是对的,原始的新 mini 永远不会被删除(泄露)。

关于c++ - 为什么这个方法的返回被破坏了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55404913/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com