为什么此方法的返回被破坏

Why is the return of this method getting destructed?

本文关键字:返回 此方法 为什么      更新时间:2023-10-16
#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(( 在块结束之前运行在这里?或者更确切地说是...如果我将方法的输出更改为 mini*,那么它不会被删除。我知道堆栈对象确实被删除了,但我是新来的。

考虑一下这里发生了什么

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

ret() 是一个返回mini by-value 的函数。

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

若要可视化它,请实现一个复制构造函数:

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

指纹

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

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

您按值返回 mini,因此为返回创建第二个实例(使用复制构造函数,未打印任何内容(,并在调用者丢弃它时销毁。