首页 > 解决方案 > 为什么这个方法的返回被破坏了?

问题描述

#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* 那么它不会被删除。我知道堆栈对象确实被删除了,但我是新来的。

标签: c++

解决方案


考虑这里发生的事情

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

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

new mini()mini在堆上分配。return *(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

所以你是对的,原来的 new'dmini永远不会被删除(泄露)。


推荐阅读