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

C++ 擦除共享指针向量时可能发生内存泄漏,c++,pointers,boost,vector,C++,Pointers,Boost,Vector,我有以下向量: 矢量实体 为了重置我正在使用的向量擦除 entities.erase(entities.begin()、entities.end()) 问题: 这个程序正确吗?它会导致内存泄漏吗?我是否也应该删除FactClass 类实体 类Entity的构造函数将类型为FactClass class Entity { public: Entity(std::vector<boost::shared_ptr<FactClass>>); vect

我有以下向量:

  • 矢量实体
为了重置我正在使用的向量擦除

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


否,这不会泄漏内存(如果
共享\u ptr
的实现是正确的,这适用于boost和std的
共享\u ptr
)。
shared\u ptr
对象被销毁时,内存将被释放。

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

  • entities.erase(entities.begin()、entities.end())

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

由于在
向量中有智能指针(
共享的\u ptr
),您的代码不会泄漏

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

(对于
共享\u ptr
的特定情况,存在与指针关联的引用计数;因此,析构函数将减少关联智能指针的引用计数,并且一旦引用计数达到零,意味着不再引用指向的对象,这将自动删除。)


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

我实际上想重置向量,这就是我使用
擦除
的原因。如果我使用clear有什么区别?
clear
也是正确的(关于意图也更明确)。@HaniGoc它打字更少,更容易出错,更能表达意图“我是否应该删除FactClass?”如果你仍然需要这样做,你认为
共享\ptr
有什么作用?如果它不能为你做到这一点,你为什么还要费心去使用它呢?#Otomo这样我就不必为了重置vector@HaniGoc不,我是莱伊。它是C++的精华,根据many@HaniGoc就像@sehe所说的:因为
shared\u ptr
被设计成RAII,所以只需删除它或让它超出范围即可保存。这就是智能指针的用途。@oto同样重要:
std::vector
还承诺在擦除/清除/调整大小和销毁时对元素进行异常中性销毁
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;
};