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

Posted

技术标签:

【中文标题】0x5919c8ec (msvcr100d.dll) 处的第一次机会异常:0xC0000005:访问冲突读取位置 0xfeeefeee【英文标题】:First chance exception at 0x5919c8ec (msvcr100d.dll): 0xC0000005: Access violation reading location 0xfeeefeee 【发布时间】:2011-10-12 21:19:53 【问题描述】:

比较两个字符串时出现此错误(使用重载运算符)。

错误发生在这里:

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 上搜索了大约一个小时,没有发现与我的具体错误相关的任何内容,感谢您的帮助。

【问题讨论】:

【参考方案1】:

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

【讨论】:

Etu 是在一个案例(在开关中)中创建的,其中填充了来自用户的信息。然后我调用addEtu 以参数中的Etu。在此之后,我删除了Etu。可以再次调用创建Etu 的情况。这会是问题吗? 您可能在删除 Etu 后尝试添加它,方法是使用以下(伪代码)序列:Etu = new element; addEtu(Etu); delete Etu; addEtu(Etu); 我不这么认为,案件是这样的:case 1: element *Etu = new element; addEtu(Etu); delete Etu; break; delete Etu;break; 在案件的最后。 嗯,据我所知,Etu 的值是 0xFEEEFEEE,而不是真正的 element。您应该能够在调试器中看到它。如果确实如此,那么您将跳过一些Etu = new element(在这种情况下可能缺少break?)。我没有其余的代码,所以我不能确切地说出发生了什么,但你认为正在发生的事情和实际发生的事情之间可能存在差异。请注意,错误出现在对addEtu第二次 调用中,您在上面的评论中没有描述。 嗯,我很确定我没有跳过一个新元素,也没有休息。如果你想自己检查,我将代码(大致翻译)上传到pastebin:pastebin.com/imPVTiQu【参考方案2】:

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

【讨论】:

嗯,我认为这就是问题所在。但我不确定如何管理它。如果我不删除它,每次我再次调用该函数都会覆盖它,不是吗? 没关系,只要评论删除 etu 就可以了。非常感谢,我整天都在寻找解决这个问题。

以上是关于0x5919c8ec (msvcr100d.dll) 处的第一次机会异常:0xC0000005:访问冲突读取位置 0xfeeefeee的主要内容,如果未能解决你的问题,请参考以下文章

0x5746723c (msvcr100d.dll) 处最可能的异常: 0xC0000005: 读取位置 0xccccccc8 时发生访问冲突

未找到 MSVCP100D.dll,[关闭]

vs2010运行总是提示:(msvcr90d.dll) 处最可能的异常: 0xC0000005,怎么回事

2&gt;MSVCRTD.lib(MSVCR100D.dll) : error LNK2005: _calloc 已经在 LIBCMTD.lib(dbgcalloc.obj) 中定义(示例代码

C++ 应用程序(调试版)包含 VS 运行时库 msvcr90.dll 和 msvcr90d.dll

为啥我的发布版本仍在寻找调试 DLL (MSVCR110D.dll)?