我正在阅读wxWidgets教程:http://docs.wxwidgets.org/trunk/overview_helloworld.html
我注意到他们使用new而不删除。这怎么可能:S如何在不删除它的情况下在类上使用new:S对我没有任何意义:l
有人可以解释发生了什么吗?
答案 0 :(得分:7)
在程序执行结束时,进程'内存空间中的所有内存都被操作系统释放。
本教程很可能向您展示了一个简单的示例,该示例要求实例化对象一直存在,直到程序结束。
例如,为程序创建窗口将一直存在,直到程序退出。所以没有必要删除它,因为操作系统会为你做这件事。
我不是说这是一种好习惯,我总是建议你明确地照顾释放记忆以养成良好的习惯。
c ++中还有其他选项,例如智能指针,它在refcounts达到0时处理对象的删除,但我不认为这是在这里发生的事情。
答案 1 :(得分:2)
某些类库有一条规则,它将指针的所有权作为子对象提供给父对象。
在这种情况下,当您new
一个对象并将其传递给所有者对象时,所有者的任务是delete
指针。
例如,窗口小部件对象在其子列表中添加GUI控件,当要删除所有者时,其析构函数delete
为子项。
阅读关于避免内存泄漏的wxWidgets的documentation:
子窗口
当wxWindow被销毁时,它会自动删除它的所有内容 儿童。这些孩子都是接收窗口的对象 作为构造函数中的父参数。
因此,如果您正在创建包含的派生类 子窗口,你应该使用指向子窗口的指针 对象本身作为主窗口的成员。
答案 2 :(得分:1)
您可以使用New而不删除,但仅当您希望对象的生命周期持续到程序退出为止。一般来说,它被视为不良形式。
答案 3 :(得分:1)
是的,可以在不调用new
的情况下使用delete
,但一般来说这是不好的形式。但是,仅仅因为你在没有明确地自己调用new
的情况下调用delete
并不意味着它没有被调用。关于GUI框架,他们中的许多人根据外部事件在内部处理调用delete
。例如,如果您调用new
来创建表示窗口的对象,则当OS破坏窗口时,GUI框架可能调用delete
。除非您熟悉框架或阅读文档,否则它可能并不明显。
还有“智能指针”,这些对象包含指向特定资源的指针,并在智能指针本身被销毁时释放(删除)它。 Boost和C ++ 11提供智能指针(例如std::unique_ptr
)的实现,这些指针经常用于管理使用new
创建的对象的生命周期(和所有权)。这当然是智能指针的概括,因为有各种实现使用引用计数或其他机制来确保资源仅在不再使用时才被释放。
网上有很多关于智能指针,资源生命周期,资源所有权等的文章。快速的Stackoverflow或Google Dance for“C ++智能指针”将为您提供各种大量的资源供进一步阅读。搜索缩略词RAII和SBRM也会带来大量资源。
答案 4 :(得分:0)
这与wxFrame
类的实现方式有关。框架关闭时,对象将被删除。
wxFrame的默认关闭事件处理程序使用Destroy()破坏框架。
通常,您确实需要删除使用new分配的对象,但在这种情况下,其他人正在为您执行此操作。