什么时候会释放记忆?

时间:2011-10-04 10:35:02

标签: c++ memory pointers

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

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

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

7 个答案:

答案 0 :(得分:17)

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

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

答案 1 :(得分:12)

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

void
proc()
{
    Z z;
}

并跳过动态分配。如果对象的生命周期对应于 它的范围,你很少需要动态分配。

如果由于某种原因你确实需要动态分配(例如因为 多态性),然后你应该使用某种智能指针; std::auto_ptr在这里工作得很好,scoped_ptr之类的东西,如果你的话 拥有它们,可能会更好。

答案 2 :(得分:7)

这是C ++的基础之一。

动态分配

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

Z* z = new Z();

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

delete z;

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

<强> 声明

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

Z z;

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

动态分配与宣言

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

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

仅供参考:Stack = Performance,但not always the best solution

<强> 参考

为了您的荣幸:tic tac toe

答案 3 :(得分:4)

除非您将z传递给delete,否则将会发生内存泄漏。

答案 4 :(得分:1)

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

答案 5 :(得分:1)

Z的析构函数不会被调用,除非你在代码中输入这样的行:

delete z;

答案 6 :(得分:1)

当你使用new时,对象在堆上分配,堆在你的程序中的所有函数之间共享,即你可以松散地说,堆分配对象的范围是你的程序,所以没有删除对象,它将一直存在,直到您的程序退出。