【发布时间】:2013-03-25 12:22:06
【问题描述】:
假设我有一个 STL 向量,其元素是指向其他类的原始指针。很明显,向量的析构函数不会释放这些指针所拥有的内存。是否可以实现一个自定义析构函数来释放这个内存?
【问题讨论】:
-
你需要的不仅仅是一个析构函数(以及三法则的其余部分);您还需要非常小心,不要因重新分配元素而丢失指针。有关血腥细节,请参见 Boost 指针容器的实现;在现代 C++ 中,只需使用
vector<unique_ptr>。 -
@MikeSeymour 无论你做什么,都不要在容器中使用
unique_ptr。迟早,你一定会做类似auto x = v[i];的事情,有效地从容器中删除指向对象。如果必须,请使用shared_ptr,但 Boost 指针容器是更好的解决方案,在极少数情况下容器应该拥有对象。 -
@JamesKanze:您是否在考虑
auto_ptr,(这些天)您不应该将其用于任何事情?使用唯一指针,auto x = v[i]不应该在没有显式move的情况下编译。 -
@JamesKanze:我不知道你在说什么;我从未听说过与在容器中使用
unique_ptr相关的任何“问题”,在我看来,这对它们来说是一个理想的用途。auto x = std::move(v[i])将显式提取一个值;auto x = v[i]不会编译。 -
@JamesKanze:
unique_ptr的论点是它完全符合 OP 的要求:通过容器中的指针自动管理对象的生命周期。是你试图根据甚至无法编译的示例代码所说明的“问题”的模糊讨论来反对它,以及它不能“正常工作”的模糊断言,无论这意味着什么。如果您有更好的解决方案,请写下答案。