我已经创建了一个代码块,就像这样。
proc()
{
Z* z = new Z();
}
现在,在方法proc中声明的指针只有proc才有。我想询问何时自动调用DTOR for z。当控件来自方法proc还是我的应用程序关闭时。
答案 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。
<强> 参考 强>
答案 3 :(得分:4)
除非您将z
传递给delete
,否则将会发生内存泄漏。
答案 4 :(得分:1)
不会自动调用DTOR。您应该使用“删除”关键字。
答案 5 :(得分:1)
Z的析构函数不会被调用,除非你在代码中输入这样的行:
delete z;
答案 6 :(得分:1)
当你使用new时,对象在堆上分配,堆在你的程序中的所有函数之间共享,即你可以松散地说,堆分配对象的范围是你的程序,所以没有删除对象,它将一直存在,直到您的程序退出。