0x5919c8ec(msvcr100d.dll)的第一次机会异常:0xC0000005:访问冲突读取位置0xfeeefeee

时间:2011-10-12 21:19:54

标签: c++

我在比较两个字符串时使用了这个错误(使用重载运算符)。

错误发生在这里:

void addEtu(node *Node, element *Etu){
    if (Node->Value == NULL)
        Node->Value = Etu;
    else{
        if (Node->left == NULL && *Node > *Etu) //This line specifically
            Node->left->Value = Etu;
        else if (Node->left != NULL && *Node->left < *Node)
            addEtu(Node->left, Etu);
        else if (Node->right == NULL)
            Node->right->Value = Etu;
        else
            addEtu(Node->right, Etu);
    }
}

重定向到iosfwd;特别是这个功能:

static int __CLRCALL_OR_CDECL compare(const _Elem *_First1, const _Elem *_First2,
        size_t _Count)
        {   // compare [_First1, _First1 + _Count) with [_First2, ...)
        return (_CSTD memcmp(_First1, _First2, _Count));
        }

node是一个包含两个节点和'value'的结构,一个包含一些字符串的结构。 重载如下:

bool operator>(const node& V1, const node& V2){
    if (V1.Value->Code > V2.Value->Code)
        return true;
    return false;
}

函数addEtu接入参数的节点是(二叉树的)根,它的初始化如下:

void Initialize(node *Root){
    Root->right = NULL;
    Root->left = NULL;
    Root->Value = NULL;
}

第二次调用addEtu时会发生错误。

我不知道出了什么问题,我用Google搜索了大约一个小时,发现没有任何与我的具体错误相关的内容,因为任何帮助都是值得赞赏的。

2 个答案:

答案 0 :(得分:3)

0xFEEEFEEE是VS用于在调试版本上标记释放指针的模式。所以你有一个悬空指针(即你已经释放的指针),你试图取消引用。鉴于Node->left没有抛出,它可能是Etu

答案 1 :(得分:0)

看起来您正在树中存储Etu,但在退出addEtu后,您正在删除Etu。这意味着树中的节点现在指向已删除的对象。