在C ++中更正对象的生命周期管理

时间:2013-01-14 09:56:50

标签: c++ memory-management

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

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

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

所以,我的选择是:

  1. 永远不要在堆栈上定义它们(BAD)
  2. 在构造函数中传递bool,指示是否应删除此对象(BAD)
  3. 每次使用后手动删除对象,具体取决于我创建它们的方式(BAD)
  4. 将这些项目“本地”复制(因为可能有数以千计的项目,这是不好的)
  5. 智能指针?一些框架? (我的用法相当有限)
  6. 我错过了什么吗?还有其他想法吗?

    谢谢, 瓦迪姆。

2 个答案:

答案 0 :(得分:0)

在C ++ 11中,您将定义一个移动构造函数,并在它超出范围之前调用std::move,这样它就可以传递资源的所有权,否则将获得delete d。

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

来完成的

被删除的指针应该默认构造为null,并且在交换(或复制构造函数或任何函数)将指针传递到超出范围的新容器对象之后,它们将被设置为{ {1}}所以NULL没有效果(并使对象无法使用,这是“脏”但不是很糟糕,因为你可以很容易地确保对象在移动后不被用于任何东西)。

答案 1 :(得分:0)

考虑将子对象保存在std::list中。您不是使用new,而是使用push_back()编写一个创建新子项的函数,并返回指向它的指针。您不需要直接销毁孩子,也可以防止泄漏。