c++ - 为什么不为函数返回的对象调用析构函数?

标签 c++ memory-management destructor

我在想,当一个函数将堆栈上的一个对象返回给调用函数时,调用函数会获取原始对象的拷贝,但是一旦堆栈展开,就会调用原始对象的析构函数。但是在下面的程序中,析构函数只被调用一次。我预计它会被调用两次。

#include <iostream>

class MyClass
{
public:
  ~MyClass() { std::cout << "destructor of MyClass" << std::endl; }
};

MyClass getMyClass()
{
  MyClass obj = MyClass();
  return obj;   // dtor call for obj here?
}

int main()
{
  MyClass myobj = getMyClass();
  return 0;  // Another dtor call for myobj.
}

但是“MyClass 的析构函数”只打印一次。我的假设是错误的还是这里发生了其他事情?

最佳答案

这是允许编译器优化拷贝的特殊情况:这称为 named return value optimization (NRVO)。基本上,编译器为调用站点上的返回对象分配内存,并让函数直接填充该内存,而不是在被调用站点创建对象并将其复制回来。现代编译器会尽可能定期执行此操作(在某些情况下,这并不容易,因为函数中有多个返回路径返回不同实例)。

关于c++ - 为什么不为函数返回的对象调用析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/697868/

相关文章:

c++ - 相互依赖的本地类(或相互递归的 lambda)

linux - : Swapping in Paging (memory allocation)

c++ - 在 C++ 中强制最后破坏某些东西

c++ - 在同一个类的析构函数中调用类的构造函数

c++ - 在 Qt 中将 WCHAR 转换为 QString

c++ - COM 事件处理的最快方式(在性能方面)

c++ - Qt 应用程序 : Failed to load platform plugin "windows". 可用平台有:

python - 在 Python 中强制垃圾收集以释放内存

memory-management - 在 Linux 中模拟设备 - 需要一种在 RAM 中分配资源的方法

c++ - 将 unique_ptr 分配给引用时,在成员函数之前调用析构函数