分段错误释放指针向量

时间:2015-11-05 10:45:35

标签: c++ templates pointers vector

我在编译下面的代码时遇到分段错误错误。当我尝试释放指针向量时,这来自析构函数实现。你能帮忙吗?

我还有另一个问题。对我来说,我认为我只能删除向量内的指针,并且矢量将被自动删除。但是当指针被删除时,向量是否可能保留任何内容?感谢

#include <iostream>
#include <string>
#include <cmath>
#include <vector>
#include <iterator>

using namespace std;

/* ******************************************************* Node ********************************************************* */

template<class T>
class Node
{
    private:
        T _value;
        vector<Node<T>*> children;

    public:
        Node(T value);
        Node(const Node<T>& node);
        void AddChild(Node<T>* node);
        T getValue() const;
        vector<Node<T>*> returnChildren() const;
        ~Node();
};

template <class T>
Node<T>::Node(T value):_value(value)
{
    children.push_back(NULL);
}

template <class T>
Node<T>::Node(const Node& node):_value(node.getValue()), 
                                children(node.returnChildren())
{
}

template <class T>
void Node<T>::AddChild(Node* node)
{
    if (children[0]==NULL){children.pop_back();};
    children.push_back(node);
}

template <class T>
T Node<T>::getValue() const
{
    return _value;
}

template <class T>
vector<Node<T>*> Node<T>::returnChildren() const
{
    return children;
}

template <class T>
Node<T>::~Node()
{
    for (typename vector<Node<T>*>::iterator it=children.begin() ; it!=children.end() ; it++)
    {
        delete *it;
    }
}



int main()
{
    Node<int> n(3);
    Node<int> nn(4);
    n.AddChild(&nn);
    Node<int>* child= new Node<int>(*(n.returnChildren()[0]));
    cout << (*child).getValue() << endl;
}

1 个答案:

答案 0 :(得分:0)

恕我直言基本上有两个错误: 1)在~Node()中你应该添加检查以查看指向子节点的指针是否为空(否则删除空指针会导致seg错误) 2)在主函数节点中实例化为局部变量(在函数的堆栈中而不是在堆中)将在函数退出时自动启动~Node():这意味着另一个seg错误,因为您正在尝试删除两次相同的指针。