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