我有以下矢量:
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;
};
答案 0 :(得分:2)
不,这不会泄漏内存(如果shared_ptr
的实现是正确的,那么它适用于提升和标准shared_ptr
)。在shared_ptr
对象被销毁的那一刻,内存将被释放。
答案 1 :(得分:1)
clear()是根据erase()定义的,它具有线性复杂性。在擦除中,我们提供范围作为参数,而clear是整个范围的擦除实现。
与
相同并且它们保持向量的容量()不变,因此没有内存泄漏。
答案 2 :(得分:0)
由于shared_ptr
中有智能指针(vector
),您的代码不会泄漏。
当拥有拥有原始指针时应该注意,但是当你有智能指针时,智能指针的析构函数将进行适当的清理。
(对于shared_ptr
的特定情况,有一个引用计数与指针相关联;因此,析构函数将减少相关智能指针的引用计数,并尽快当ref计数达到零时,意味着没有对指向对象的更多引用,这是自动删除。)
无论如何,我更喜欢使用 vector::clear()
方法,这更明确地说明了“重置”向量的意图。