擦除共享指针向量时可能发生内存泄漏
Possible Memory leak while erasing a vector of shared pointers
我有以下向量:
vector<boost::shared_ptr<Entity>> entities;
为了重置我正在使用的向量erase
entities.erase(entities.begin(), entities.end());
问题
这个程序正确吗?会不会导致内存泄漏?我是否也应该删除 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" 向量的意图。
我有以下向量:
vector<boost::shared_ptr<Entity>> entities;
为了重置我正在使用的向量erase
entities.erase(entities.begin(), entities.end());
问题
这个程序正确吗?会不会导致内存泄漏?我是否也应该删除 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" 向量的意图。