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

Possible Memory leak while erasing a vector of shared pointers

我有以下向量:

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


问题

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


Class实体

class 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事实Class

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

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

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

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

相同
  • entities.clear();

并且他们保持 vector 的 capacity() 不变,所以没有内存泄漏。

您的代码 不会 泄漏,这要归功于 smart 指针 (shared_ptr) vector .

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

(对于 shared_ptr 的特定情况,有一个 引用计数 关联到指针;因此,析构函数将减少关联智能的引用计数指针,一旦引用计数达到零,这意味着不再有对指向对象的引用,这将被自动删除。)

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