什么时候会释放记忆?

Apo*_*hay 6 c++ memory pointers

我已经创建了一个代码块,就像这样.

proc()
{
    Z* z = new Z();
}
Run Code Online (Sandbox Code Playgroud)

现在,在方法proc中声明的指针将只有范围直到proc.我想询问何时自动调用DTOR for z.当控件来自方法proc还是我的应用程序关闭时.

NPE*_*NPE 17

根本不会调用析构函数.使用的内存*z将被泄露,直到应用程序关闭(此时操作系统将回收您的进程使用的所有内存).

为了避免泄漏,你必须delete在某个时候打电话,或者更好的是,使用智能指针.


Jam*_*nze 12

这是内存泄漏.你可能应该拥有的是:

void
proc()
{
    Z z;
}
Run Code Online (Sandbox Code Playgroud)

并跳过动态分配.如果对象的生命周期与其范围相对应,则很少需要动态分配.

如果由于某种原因你需要动态分配(例如因为多态),那么你应该使用某种智能指针; std::auto_ptr在这里运作良好scoped_ptr,如果你有它们,可能会更好.


And*_*ovs 7

这是C++的基础之一.

动态分配

在您的情况下,内存分配和后续构造函数调用Z将发生在new:

Z* z = new Z();
Run Code Online (Sandbox Code Playgroud)

销毁和内存释放的相反部分将发生在delete:

delete z;
Run Code Online (Sandbox Code Playgroud)

但是由于你的代码没有它,内存释放永远不会发生,而且你将失去指针z,以后将来不可能解除分配对象.这是典型的内存泄漏.

宣言

另一方面,如果你声明这样的对象:

Z z;
Run Code Online (Sandbox Code Playgroud)

内存分配和构造函数将立即在声明点处被调用,当对象的存在范围完成时(即在函数结束时),将自动调用析构函数并释放内存.

动态分配与声明

我不会讨论什么是更好的,什么不是什么,而是将提供下面链接的一篇文章的摘录:

与将数据加载到程序数据段的声明不同,动态分配在程序STACK(专门分配给该程序的RAM区域)上创建新的可用空间.

仅供参考:Stack = Performance,但并非总是最佳解决方案.

参考

为了您的乐趣:tic tac toe.


小智 1

DTOR 不会被自动调用。您应该使用“删除”关键字。