将指针push_back到指针向量是一个内存泄漏吗?

时间:2012-09-16 05:56:14

标签: c++ pointers memory-leaks vector c++11

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

向量生成指针的副本,我有两个指向同一内存的指针, 然后原始指针超出范围,对吧?

这可能很简单明了,但我想确认一下我的假设 感谢

5 个答案:

答案 0 :(得分:13)

这不是泄漏......但是,如果vector超出范围,或者您erasepop_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>

答案 1 :(得分:2)

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

答案 2 :(得分:1)

这不是内存泄漏。你仍然在向量中有一个指针,你可以在需要时释放内存。

答案 3 :(得分:1)

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

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

答案 4 :(得分:-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 );

如果您使用了vector<Foo>child,则向量上的每个push_back都会创建要存储的原始对象的副本,但是因为您正在使用指针,所以在这种情况下在堆上分配通过new没有创建对象副本,指向长寿命术语对象的指针只是存储,意味着是的,您必须稍后删除它。