首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个方法的返回被析构了?

为什么这个方法的返回被析构了?
EN

Stack Overflow用户
提问于 2019-03-29 02:50:52
回答 2查看 132关注 0票数 2
代码语言:javascript
复制
#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";
}

输出:

代码语言:javascript
复制
mini()~mini()end of block

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

EN

回答 2

Stack Overflow用户

发布于 2019-03-29 02:57:04

想一想这里发生了什么

代码语言:javascript
复制
  mini ret()
  {
    return *(new mini());
  }

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

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

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

代码语言:javascript
复制
#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";
}

打印

代码语言:javascript
复制
mini()
mini() copy
~mini()
end of block

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

票数 8
EN

Stack Overflow用户

发布于 2019-03-29 02:56:55

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55404913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档