当内存将被释放?

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

proc()
{
    Z* z = new Z();
}

现在在方法proc中声明的指针将只有proc才有作用域。 我想问什么时候z的DTOR将被自动调用。 无论何时控件从方法proc出来或当我的应用程序关闭时。


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

为了避免泄漏,你必须在某个时候调用delete ,或者更好的方法是使用智能指针。


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

void
proc()
{
    Z z;
}

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

如果由于某种原因你需要动态分配(例如,因为多态),那么你应该使用某种智能指针; std::auto_ptr在这里工作得很好,而像scoped_ptr这样的东西,如果你有它们,可能会更好。


这是C ++的基本原理之一。

动态分配

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

Z* z = new Z();

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

delete z;

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

宣言

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

Z z;

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

动态分配与声明

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

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

供参考:堆栈=性能,但并不总是最好的解决方案。

参考

为了您的快乐:tic tac toe。

链接地址: http://www.djcxy.com/p/13883.html

上一篇: when memory will be released?

下一篇: Why do C# and Java bother with the "new" operator?