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

时间:2019-03-28 18:50:52

标签: c++

#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 *,则不会将其删除。我知道堆栈对象确实会被删除,但我是新手。

2 个答案:

答案 0 :(得分:8)

考虑这里发生的事情

  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

答案 1 :(得分:0)

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