将指针push_back到指针向量中是内存泄漏吗?
Is it a memory leak to push_back a pointer into a vector of pointers?
在我的类中,我有一个成员变量std::vector<node*> children
以下类成员函数是否会产生内存泄漏?
//adds a child node
{
node* child = new node("blah","blah","blah");
child->Set_Parent(this);
children.push_back(child); //<- Is this ok?
}
向量复制了指针,我有两个指向同一内存的指针,然后原始指针超出了范围,对吧?
这可能简单明了,但我只想确认我的假设。
谢谢
这不是
泄漏...还。但是,如果vector
超出范围,或者您erase
、pop_back
或执行其他操作以从矢量中删除元素,而没有先delete
要删除的元素,那么您的手就会泄漏。
执行此操作的正确方法是 从使用vector<node *>
更改为vector<unique_ptr<node>>
.您的代码将更改为
//adds a child node
{
node* child = new node("blah","blah","blah");
child->Set_Parent(this);
children.push_back(std::unique_ptr<node>(child));
}
或者,如果您可以使用 Boost,请使用 boost::ptr_vector<node>
。
如果在调用包含向量析构函数的类时忘记释放子节点,则只会发生内存泄漏。
这不是内存泄漏。矢量中仍有指针,可以在需要时释放内存。
当向量超出范围时,它的析构函数不会破坏指向的对象。它破坏了指针——指针什么也不做。
您的代码通过 new
创建了该对象。您的代码负责删除该对象。如果你不这样做,你就有泄漏。如果你这样做到早期,即在从向量中删除指针之前,你就会遇到更大的问题。
假设children
是一个类成员,您只需删除类解构器上向量中的所有项。
struct Foo{};
class Bar
{
public:
Bar(){};
~Bar()
{
for( vector<Foo*>::iterator it = children.begin(); it != children.end(); ++it )
{
SAFE_DELETE( (*it) ); //use your own macro/template or use delete if you don't have one
delete (*it);
(*it) = NULL;
}
}
vector<Foo*>children;
}
Foo* p = new Foo();
children.push_back( p );
如果您改用vector<Foo>child
,则向量上的每个push_back
都会创建要存储的原始对象的副本,但由于您使用的是指针,在这种情况下,通过不创建对象副本new
堆上分配,因此简单地存储指向长期期限对象的指针, 意思是的,您必须稍后删除它。