自动删除新操作员
Auto Deleting New Operator
我正在阅读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
创建的对象的生命周期(和所有权)。这当然是智能指针的泛化,因为有各种各样的实现使用引用计数或其他机制来确保资源只有在不再使用时才被释放。
这与wxFrame
类的实现方式有关。当帧关闭时,对象将被删除。
wxFrame的默认关闭事件处理程序使用Destroy()销毁帧。
通常情况下,您确实需要删除与new分配的对象,但在这种情况下,其他人正在为您做这件事。
- 将数组的地址分配给变量并删除
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C/C++编译器通常会删除重复的库吗
- 从链接列表c++中删除一个项目
- C++如何通过用户输入删除列表元素
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 使用自定义参数的过载删除操作员
- 使用C 中的操作员删除的分割故障
- 在抽象类中删除操作员,它如何工作
- 继承类上的运算符new和delete.操作员删除未执行
- 为什么被删除=操作员,我该如何工作
- c 从范围删除对象的操作员导致崩溃dealloceLoceLoceLoceLoceLoceLoceLoceLoceL
- MINGW中的全局超载操作员新/删除
- 复制动态阵列并使用过载的操作员删除原件
- C 删除具有内存位置的操作员
- 删除的操作员隐藏了类操作员
- 基本的新建/删除操作员日志记录
- Clang链接时间优化与替换的操作员新的原因不匹配的自由()/删除在valgrind
- 删除操作员内存管理
- 自动删除新操作员