【发布时间】:2012-12-28 06:46:21
【问题描述】:
我有几个简单的 C++ 类来保存数据。它们是分层的,每个都包含一个指向孩子的指针列表(因为我在内存中有很多,我不想复制它们)。
我只在最高级别工作(将其传递给函数),并且希望每个级别的析构函数都销毁其子级,所以我要做的就是释放所有子级,只需在最顶层的父级上调用 delete .当在堆栈上创建某些类时,这会导致问题,但这实际上只是问题的症状。
正如我所见,我需要在同一级别上创建和销毁对象,从而知道是否应该调用 delete。但是,这将迫使我在代码中每次使用后都持有指向所有子级的指针并销毁它们,这是一个比在最顶层的父级上调用 delete 更脏的解决方案。
所以,我的选择是:
- 永远不要在堆栈上定义它们 (BAD)
- 在构造函数中传递一个布尔值,指示是否应删除此对象 (BAD)
- 在每次使用后手动删除对象,具体取决于我创建它们的方式 (BAD)
- “本地”复制项目(因为可能有数千个,所以不好)
- 智能指针?一些框架? (我能用的东西比较有限)
我错过了什么吗?还有其他想法吗?
谢谢, 瓦迪姆。
【问题讨论】:
-
你能升级(如果有必要的话)并使用 C++11 吗?这是
std::move的典型代表。 -
我认为我不能升级到 C++11,我们使用的是 gcc 3.2,而且这个项目(或问题)对于升级编译器来说不够重要。
-
另一件事 - 这不仅仅是一个 C++ 问题,我所做的某处存在 OOP 设计缺陷,我找不到好的解决方案。
-
你对问题的描述太抽象了。我不明白为什么会出现你不知道某个对象是堆栈分配还是堆分配的情况。
-
我只定义类,我无法控制它们在使用时的实例化方式。我会纠正自己 - 我不想控制它们的实例化方式,否则我会使用工厂来解决我的问题。对于非常简单的 POCO,我似乎太过分了。
标签: c++ memory-management