在C ++中删除匿名对象

时间:2012-04-16 15:09:09

标签: c++ memory-management new-operator

在C ++中,如果将匿名对象作为参数传递给命名对象方法,那么在删除命名对象时是否会删除匿名对象?

项目的library I'm using需要指向大多数自己对象方法的对象,la:

WContainerWidget::addWidget(WContainerWidget* widget) {/*...*/}

在他们的例子中,他们经常在构造这些对象时使用new运算符。

WContainerWidget* aFoo = new WConainerWidget(/*args*/);
aFoo->addWidget(new WText(/*args*/));

如果我delete aFoo,是否会删除匿名WText()对象?

我是否相信他们的实现会在不对其源代码进行排序的情况下处理这些删除,或者我应该避免示例行为,并自己明确地命名/删除所有内容?

3 个答案:

答案 0 :(得分:4)

是的,小部件获得所有权并自动销毁:

http://www.webtoolkit.eu/wt/doc/reference/html/overview.html

  

在窗口小部件层次结构中插入窗口小部件时,所有权将转移到树中的父窗口。

这是一个定义不明确的界面。它来自旧学校,人们仍在定义类似C接口的接口。

指针的传递是愚蠢的想法,因为没有与之相关的所有权概念,因为现代C ++库已经转向使用智能指针的概念。这提供了一种机制,用于在代码中记录(并由编译器强制执行)指针所有权的概念。

答案 1 :(得分:3)

不是自动,不是。 WContainerWidget对象需要知道它“拥有”WText对象,并且需要确保在适当的时候删除它。

传统意味着WContainerWidget有一个Widget*值列表,而在~WContainerWidget析构函数中,它会遍历并在每个存储值上调用delete。< / p>

您还可以使用智能指针(例如auto_ptr,如果您拥有它,或者使用来自Boost或C ++ 11的shared_ptr)来保存每个WText* } value,这将确保在智能指针被销毁时释放对象。

答案 2 :(得分:1)

答案很简单:不(*)

你得到一个悬空指针,最后是内存泄漏

(*不是那么绝对)

有一些方法可以执行 new ,同时保留对对象的控制权(重载类的新运算符)。 但是,这种情况并不常见。 更常见的方法是使用对象工厂。在这种情况下,您将看不到新的