0xC0000005:访问冲突读取位置0xCDCDCDCD

时间:2018-07-16 14:40:06

标签: c++

我为大型项目制作的二进制搜索树出现了问题。

有一个节点:

template <class Key, class Value>
struct Node
{
public:
    Key key;
    vector<Value> value;
    Node* leftNode;
    Node* rightNode;

    Node(Key k, Value v)
    {
        key = k;
        value.push_back(v);
    }
};

这些节点正在存储到BST中。

BST的插入功能中发生错误:

template <class Key, class Value>
void BinarySearchTree<Key, Value>::insert(const Key &key, const Value &value)
{
    insert(root, key, value);
}


template <class Key, class Value>
void BinarySearchTree<Key, Value>::insert(Node<Key, Value> *&node, const Key &key, const Value &value)
{
    if (node == nullptr)
        node = new Node<Key, Value>(key, value);

    // Error occurs here.
    else if (node->key == key)
        node->value.push_back(value);

    else if (key < node->key)
        insert(node->leftNode, key, value);
    else
        insert(node->rightNode, key, value);
}

第一个节点没有问题地插入树中,但是第二个Insertion调用引发错误。

任何帮助我步入正轨的方法将不胜感激。

2 个答案:

答案 0 :(得分:3)

您的插入代码似乎假设Node::leftNodeNode::rightNode初始化为nullptr,但是您的构造方法不能保证这样做。试试这个

Node(Key k, Value v)
{
    key = k;
    value.push_back(v);
    leftNode = rightNode = nullptr;
}

答案 1 :(得分:1)

您的代码未初始化leftNoderightNode。如果没有原始指针值,则不对它们进行值初始化。 std::unique_ptr的默认构造等于nullptr

似乎还没有对Node s进行任何清理

template <class Key, class Value>
struct Node
{
public:
    Key key;
    std::vector<Value> value;
    std::unique_ptr<Node> leftNode;
    std::unique_ptr<Node> rightNode;

    Node(Key k, Value v)
     : key(k), value({v})
    { }
};