4

我有几个简单的 C++ 类来保存数据。它们是分层的,每个都包含一个指向子对象的指针列表(因为我在内存中有很多它们,我不想复制它们)。

我只在最高级别工作(将其传递给函数),并且希望每个级别的析构函数都销毁其子级,所以我要做的就是释放所有这些子级,只需在最顶层的父级上调用 delete。当在堆栈上创建某些类时,这会导致问题,但这实际上只是问题的症状。

正如我所看到的,我需要在同一级别上创建和销毁对象,从而知道我是否应该调用 delete。但是,这将迫使我在代码中每次使用后都持有指向所有子级的指针并销毁它们,这是一个比在最顶层的父级上调用 delete 更脏的解决方案。

所以,我的选择是:

  1. 永远不要在堆栈上定义它们(坏)
  2. 在构造函数中传递一个布尔值,指示该对象是否应该被删除(坏)
  3. 每次使用后手动删除对象,具体取决于我创建它们的方式(坏)
  4. “本地”复制项目(可能有成千上万的项目是不好的)
  5. 智能指针?一些框架?(我可以使用的东西相当有限)

我错过了什么吗?还有其他想法吗?

谢谢,瓦迪姆。

4

2 回答 2

0

考虑将 children 对象放在std::list. 代替 using new,您编写了一个函数,该函数使用创建一个新子代push_back()并返回一个指向它的指针。您不需要直接销毁孩子,并且可以防止泄漏。

于 2014-10-17T23:49:13.730 回答
0

在 C++11 中,您将定义一个移动构造函数并std::move在对象超出范围之前调用它,以便它可以传递原本会得到deleted 的资源的所有权。

在 C++03 中,可以在没有语言形式的情况下定义相同的功能,但是您必须在对象为空的地方添加一个状态。这通常通过引入默认构造函数并实现swap.

被删除的指针应该默认构造为null,并且在交换(或复制构造函数或任何函数)将指针传递到将超出范围的新容器对象之后,它们被设置为NULL所以delete没有效果(并使对象无法使用,这很“脏”但还不错,因为您可以轻松地确保对象在移出后不用于任何事情)。

于 2013-01-14T10:15:28.607 回答