1

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

用于项目的库需要指向其大多数对象方法的对象的指针,例如:

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

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

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

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

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

4

3 回答 3

4

是的,小部件拥有所有权,它会自动销毁:

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

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

这是一个定义错误的接口。从老派开始,人们仍在定义接口,如 C 接口。

The passing of pointers is silly idea as there is no concept of ownership associated with it as such modern C++ libraries have shifted to using the concept of smart pointers. This provides a mechanism to document in the code (and enforce by the compiler) the concept of pointer ownership.

于 2012-04-16T16:56:30.810 回答
3

不是自动的,没有。WContainerWidget对象需要知道它“拥有”该对象WText,并且需要确保某些东西在适当的时间删除它。

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

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

于 2012-04-16T15:12:06.370 回答
1

答案很简单:否 (*)

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

(*不是那么绝对)

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

于 2012-04-16T15:11:41.473 回答