加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C:如何解决在未知点引起的第一次机会异常?

发布时间:2020-12-16 03:29:34 所属栏目:百科 来源:网络整理
导读:我正在努力的一个C项目在抛出第一次机会异常时终止.当我第一次尝试访问映射 pair int,int,int时,这在Visual Studio 2008中以调试模式发生.其中包含一个键值对.代码没有任何逻辑错误. 我已经阅读了第一次机会异常,并了解它们可能并不总是有问题.尽管如此,我试
我正在努力的一个C项目在抛出第一次机会异常时终止.当我第一次尝试访问映射< pair< int,int>,int>时,这在Visual Studio 2008中以调试模式发生.其中包含一个键值对.代码没有任何逻辑错误.

我已经阅读了第一次机会异常,并了解它们可能并不总是有问题.尽管如此,我试图打破所有这些异常,并且正如预期的那样,发现了几个没有引起任何问题.

我正在处理的类非常大,包含许多自定义内存分配.我猜测其中一个导致了这个问题.然而,我花了几个小时试图找到一种方法来识别出错的地方,并且无法这样做.

下面列出了第一次机会异常输出.这不是很有帮助!

First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00.
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00.
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00.
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00.
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00.
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00.
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00.
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00.
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00.
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00.
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00.
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00.
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00.
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00.
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00.
First-chance exception at 0x0050ae33 in theapp.exe: 0xC0000005: Access violation reading location 0x00000010.
Unhandled exception at 0x0050ae33 in theapp.exe: 0xC0000005: Access violation reading location 0x00000010.

我现在真的很挣扎,不确定如何继续.

任何人都可以建议我如何解决这个问题,并确切地确定出现了什么问题?我非常感谢你的建议.

UPDATE

这是相关的代码.调试器在嵌套FOR中列出的第一个cout语句中断:

// Inside operator() :

        map<pair<int,int> resultIdByStructIds;
        pair<int,int> spair (-1,-1); // Structure pair ids reusable reference.

        int nextMapEntryId = 0;
        int nextNumCandidates = 0;
        // For each remaining candidate.
        for (int ci = 0; ci < numCandidates; ) {
            // If candidate has been mapped or found not viable this mapping round,// move past it.
            if (candidatesDoneThisRound[ci] == currentMappingRoundId) {
                ++ci;
                continue;
            }

            Candidate candidate = candidates[ci];
            const int tId = candidate.tVertexId;
            const int pId = candidate.pVertexId;

            // Grab the result for this structure pair.
            // Create it if it doesn't exist.
            // Avoid copying as slight optimisation; simply
            // store pointer to true result instead.
            spair.first = tInfos[tId].structure->id;
            spair.second = pInfos[pId].structure->id;

            // DEBUG
            cout << "resultIdByStructIds size: " << resultIdByStructIds.size() << endl;
            for (map<pair<int,int>::const_iterator ids_id = resultIdByStructIds.begin(); ids_id != resultIdByStructIds.end(); ++ids_id) {
                cout << ids_id->first.first << endl; // * Debugger breaks here.
                cout << ids_id->first.second << endl;
                cout << ids_id->second << endl;
                printf("Structures(%i,%i) => %in",ids_id->first.first,ids_id->first.second,ids_id->second);
            }
            //

            // code continues...

更新2

这是有问题的地图的鼠标悬停描述的图像;如Michael Burr建议的那样,它似乎已经腐败了

解决方法

通常,为了查明应用程序崩溃的代码点,您可以在Debug / Exceptions下打开异常处理.在这种情况下,您将展开最后一个分支并检查访问冲突.当然,这将停止所有访问冲突,而不仅仅是坏的访问(访问0x10).您可以通过在最后一个已知时刻打开陷阱来最小化此操作.

通常,您会发现一些内存使用错误.确定此类错误原因的最简单方法是使用像BoundChecker这样的第三方工具,一旦损坏内存就会对你大吼大叫.由于缺乏这一点,Raymond Chen的建议很明显.弄清楚哪个对象出错了,并使用监视窗口查看它何时发生变化.或者更有效的是,使用数据断点功能可以在特定地址的数据发生变化时停止程序.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读