擦除共享指针向量时可能发生内存泄漏

时间:2015-03-23 11:00:16

标签: c++ pointers boost vector

我有以下矢量:

  • 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;
};

Class FactClass

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;
};

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

相同
  • entities.clear();

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

答案 2 :(得分:0)

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

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

(对于shared_ptr的特定情况,有一个引用计数与指针相关联;因此,析构函数将减少相关智能指针的引用计数,并尽快当ref计数达到零时,意味着没有对指向对象的更多引用,这是自动删除。)

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