【问题标题】:Possible Memory leak while erasing a vector of shared pointers擦除共享指针向量时可能发生内存泄漏
【发布时间】:2015-05-26 08:15:20
【问题描述】:

我有以下向量:

  • vector<boost::shared_ptr<Entity>> entities;

为了重置我正在使用的矢量erase

  • entities.erase(entities.begin(), entities.end());

问题

这个程序正确吗?会不会导致内存泄露?我也应该删除 FactClass 吗?


类实体

Entity 类的构造函数将FactClass 类型的共享指针向量作为参数

class Entity
{
public:
    Entity(std::vector<boost::shared_ptr<FactClass>>);
    vector<boost::shared_ptr<FactClass>> getClassFact() const;
private:
    vector<boost::shared_ptr<FactClass>> _listFacts;
};

类事实类

FactClass 类的构造函数将Fact 等类型的共享指针向量作为参数。

class FactClass
{
    public:
        FactClass(std::vector<boost::shared_ptr<Fact>>);
        std::vector<boost::shared_ptr<Fact>> getFacts() const;
    private:
        vector<boost::shared_ptr<Fact>> _fact;
};

【问题讨论】:

  • 我实际上想重置矢量,这就是我使用erase 的原因。如果我使用 clear 有什么区别?
  • clear 也是正确的(并且更明确地表达了意图)。
  • @HaniGoc 打字更少,更不容易出错,并且更能表达意图
  • “我应该也删除 FactClass 吗?” 如果您仍然需要这样做,您认为 shared_ptr 会起到什么作用?如果它不为你做,你为什么还要费心使用它?

标签: c++ pointers boost vector


【解决方案1】:

由于vector 中有智能指针 (shared_ptr),您的代码不会泄漏。

你应该注意拥有原始指针,但是当你有智能指针时,智能指针的析构函数会做适当的清理。

(对于shared_ptr的具体情况,有一个与指针关联的引用计数;因此,析构函数将减少关联的智能指针的引用计数,并且一旦ref count 达到零,表示不再引用指向的对象,这是自动删除。)

无论如何,我更喜欢调用 vector::clear() 方法,它更明确地表明了您“重置”向量的意图。

【讨论】:

    【解决方案2】:

    clear() 是根据具有线性复杂度的 erase() 定义的。在擦除中,我们提供范围作为参数,而清除是整个范围的擦除实现。

    • entities.erase(entities.begin(),entities.end());

    相同
    • entities.clear();

    并且它们保持向量的容量()不变,因此没有内存泄漏。

    【讨论】:

      【解决方案3】:

      不,这不会泄漏内存(如果shared_ptr 的实现是正确的,它适用于boost 和std 的shared_ptr)。 shared_ptr 对象被销毁的那一刻,内存将被释放。

      【讨论】:

      • #Otomo 所以我不必一路向下 factClass 和 fact 来重置向量
      • @HaniGoc 不,这是 RAII。许多人认为这是 C++ 的精髓
      • @HaniGoc like @sehe 说:因为shared_ptr 被设计为RAII,所以只需将其删除或让它超出范围即可保存。这就是智能指针的目的。
      • @Otomo 同样重要:std::vector 还承诺在擦除/清除/调整大小和销毁时对元素进行异常中性销毁
      猜你喜欢
      • 2023-03-15
      • 2014-08-13
      • 1970-01-01
      • 2013-08-25
      • 2019-05-05
      • 2019-04-18
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      相关资源
      最近更新 更多