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,如果你有它们,可能会更好.
这是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,但并非总是最佳解决方案.
参考