当内存将被释放?
我已经创建了一个代码块,就像这样。
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