【问题标题】:Deleting resources managed by a vector删除vector管理的资源
【发布时间】:2013-04-05 06:39:04
【问题描述】:

我想要一个向量来保存指向它将拥有的某些对象的指针。

这是向量:

private: std::vector<fppVirtual*> m_fapps;

我已经创建了这样的元素:

    m_fapps.push_back(new fpp1(renderingEngine)); //fpp* are subclasses of fppVirtual
    m_fapps.push_back(new fpp2(renderingEngine));
    m_fapps.push_back(new fpp3(renderingEngine));

由于m_fapps 是另一个类中的向量实例变量,我想确保该类的析构函数正确清理m_fapps

       for (int i=0, size=m_fapps.size();i<size;++i){
        delete m_fapps[i];
       }

这是可接受的内存管理技术吗?我假设需要这个循环,因为当向量在其所属类被破坏时超出范围时,只会删除指向这些 new 对象的指针,对吧?

【问题讨论】:

  • 你的向量是如何声明的?
  • 是的。但请查看std::unique_ptr 而不是这样做。
  • @KirilKirov 更新问题
  • 以后请贴出完整的代码示例。此类问题的答案通常比人们最初想象的要复杂,提供完整示例有助于确定问题(和答案)的范围。

标签: c++


【解决方案1】:

这可行(有一些注意事项),但不被认为是惯用的 C++,这是有充分理由的。

您应该强烈考虑使用智能指针向量(或类似boost::ptr_vector 的智能向量),以避免必须进行手动内存管理。

这也将免费为您提供异常安全性,并且还可以避免在您的外部类是可复制的情况下发生的令人讨厌的所有权问题。

【讨论】:

  • 如果我没有其他理由在我的项目中加入 boost,我倾向于同意 vector&lt;unique_ptr&lt;T&gt;&gt; 的另一个建议
  • @SebbyJohanns:一旦你对 Boost 有更多了解,我相信你会找到很多理由将它包含在你的项目中。
  • @SebbyJohanns:当然,标准库中现在有许多智能指针类型,请选择最适合您的用例的一种。
【解决方案2】:

由于没有人给你直接的答案 - 是的,这是可以接受的,这是释放此内存的唯一方法,具有 vector 的声明。

这可以而且应该避免,如@OliCharlesworth 建议的那样使用智能指针或使用@BjörnPollex 提出的其他容器。

【讨论】:

  • 感谢您对问题的实际回答。
【解决方案3】:

您应该改用boost::ptr_vector。界面是相同的,但它会为您处理内存管理。 See this question 获取有关是否使用 ptr_vectorvector&lt;shared_ptr&lt;&gt;&gt; 的一些指南。

【讨论】:

  • vector&lt;unique_ptr&lt;T&gt;&gt;,这可能是一个更好的默认选择,因为在 OP 的代码中没有共享所有权的迹象。
  • 正确,我仍然卡在 C++03 上。
猜你喜欢
  • 1970-01-01
  • 2018-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多