1

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

我注意到他们使用 new 而不删除。这怎么可能 :S 你如何在不删除类的情况下使用 new :S 这对我来说没有任何意义 :l

有人可以解释发生了什么吗?

4

5 回答 5

7

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

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

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

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

c++ 中还有其他选项,例如智能指针,它在引用计数达到 0 时处理对象的删除,但我认为这不是这里发生的情况。

于 2013-05-29T17:41:59.077 回答
2

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

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

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

 

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

子窗口

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

因此,如果您正在创建一个包含子窗口的派生类,您应该使用指向子窗口的指针而不是对象本身作为主窗口的成员。

于 2013-05-29T17:53:35.187 回答
1

是的,可以在new不调用的情况下使用,delete但总的来说这是一种不好的形式。然而,仅仅因为你new没有明确地调用delete自己就调用并不意味着它没有被调用。关于 GUI 框架,其中许多框架delete基于外部事件在内部处理调用。例如,如果您调用new创建代表窗口的对象,则 GUI 框架 可能会delete在操作系统销毁窗口时调用。除非您熟悉框架或阅读它的文档,否则它可能并不明显。

还有“智能指针”,它们是持有指向特定资源的指针并在智能指针本身被销毁时释放(删除)它的对象。Boost 和 C++11 提供了智能指针的实现(std::unique_ptr例如),它们经常用于管理使用new. 这当然是智能指针的概括,因为有各种实现使用引用计数或其他机制来确保仅在不再使用资源时才释放资源。

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

于 2013-05-29T18:04:01.493 回答
1

您可以在不删除的情况下使用 New,但前提是您希望对象的生命周期持续到程序退出。一般来说,它被认为是不好的形式。

于 2013-05-29T17:41:40.370 回答
0

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

引用wxWidgets 文档

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

通常,您确实需要删除使用 new 分配的对象,但在这种情况下,其他人正在为您执行此操作。

于 2013-05-29T17:52:59.057 回答