自动删除新操作员

Auto Deleting New Operator

本文关键字:操作员 删除      更新时间:2023-10-16

我正在阅读wxWidgets教程:http://docs.wxwidgets.org/trunk/overview_helloworld.html

我注意到他们使用new而不使用delete。你怎么能在一个类上使用new而不删除它呢?这对我来说没有任何意义:l

谁能解释一下这是怎么回事?

在程序执行结束时,操作系统将释放进程内存空间中的所有内存。

本教程很可能向您展示了一个简单的示例,该示例要求实例化的对象在程序结束之前一直存在。

例如,为程序创建的窗口将一直存在,直到程序退出。所以没有必要删除这个,因为操作系统会为你做。

我并不是说这是一个好习惯,我总是建议你明确地注意释放内存以养成好习惯。

c++中还有其他选项,比如智能指针,当refcount达到0时处理对象的删除,但我不认为这是这里发生的事情。

一些类库有一个规则,将指针的所有权作为父对象的子对象。

在这种情况下,当你new一个对象并将其传递给一个所有者对象时,它是所有者的任务delete指针。

例如,一个小部件对象在它的子列表中添加GUI控件,当所有者要被删除时,它的析构函数delete将删除子控件。

,

阅读wxWidgets关于避免内存泄漏的文档:

子窗口

当wxWindow被销毁时,它会自动删除所有它的的孩子。这些子对象是接收窗口的所有对象作为它们的构造函数中的父参数。

因此,如果创建的派生类包含子窗口时,应该使用指向子窗口的指针对象本身作为主窗口的成员。

您可以使用New而不使用Delete,但仅当您希望对象的生存期持续到程序退出时。一般来说,这是不礼貌的。

是的,可以使用new而不调用delete,但一般来说它的形式不好。然而,仅仅因为你调用new而没有显式地调用delete并不意味着它没有被调用。关于GUI框架,它们中的许多都是基于外部事件来处理内部调用delete的。例如,如果您调用new来创建一个表示窗口的对象,那么GUI框架可能会在操作系统销毁该窗口时调用delete。它可能不是很明显,除非你熟悉这个框架或阅读它的文档。

还有"智能指针",这些对象持有指向特定资源的指针,并在智能指针本身被销毁时释放(删除)该指针。Boost和c++ 11提供了智能指针(例如std::unique_ptr)的实现,它们经常用于管理使用new创建的对象的生命周期(和所有权)。这当然是智能指针的泛化,因为有各种各样的实现使用引用计数或其他机制来确保资源只有在不再使用时才被释放。

网上有很多关于智能指针、资源生命周期、资源所有权等的文章。快速Stackoverflow或Google Dance的"c++智能指针"将为您提供大量的资源列表,供您进一步阅读。搜索缩略词RAII和SBRM也会显示大量的资源列表。

这与wxFrame类的实现方式有关。当帧关闭时,对象将被删除。

引用wxWidgets文档:

wxFrame的默认关闭事件处理程序使用Destroy()销毁帧。

通常情况下,您确实需要删除与new分配的对象,但在这种情况下,其他人正在为您做这件事。