7

在我的课堂上,我有一个成员变量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?
}

向量复制了指针,我有两个指向同一内存的指针,然后原始指针超出范围,对吗?

这可能简单明了,但我只想证实我的假设。
谢谢

4

5 回答 5

13

这不是泄漏......但是。但是,如果vector超出范围,或者 you erasepop_back或者做其他事情从向量中删除元素,而没有首先deleteing 你要删除的元素,你手上就会有泄漏。

正确的做法是从使用 a 更改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::ptr_vector<node>,如果您可以使用 Boost,请使用。

于 2012-09-16T06:08:16.697 回答
2

如果在调用包含向量的析构函数的类时忘记释放子节点,这只是内存泄漏。

于 2012-09-16T05:59:14.567 回答
1

这不是内存泄漏。您仍然在向量中有一个指针,您将能够在需要时释放内存。

于 2012-09-16T05:59:25.247 回答
1

当向量超出范围时,它的析构函数不会破坏指向的对象。它破坏了指针——它什么也不做。

您的代码通过创建该对象new。您的代码负责删除该对象。如果你不这样做,你就有泄漏。如果你这样做很早,即在从向量中删除指针之前,你会遇到更大的问题。

于 2012-09-16T06:00:50.263 回答
-3

假设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 );

如果您使用 avector<Foo>child代替,push_back则向量上的 each 将创建要存储的原始对象的副本,但是由于您使用的是指针,在这种情况下,在堆上分配的new对象副本不会被创建,指向 a 的指针long-life term object 只是简单地存储,这意味着是的,您必须稍后将其删除。

于 2012-09-16T06:04:36.040 回答