我有一个控制台应用程序(使用MS VS2010 SP1编写)。没有MFC,没有ATL,只是标准库。在调试构建中,一切工作正常。但是在发布版本中存在访问冲突:"Mapp.exe中的第一次异常0x77b0206e: 0xC0000005:访问违规读取位置0x002cef58。"
如果我从MS VS(甚至发布模式)运行应用程序,一切工作正常,我无法找出发生了什么。我尝试使用即时调试,我收到了调用堆栈:
ntdll.dll!77b020cb()
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
Mapp.exe!_unlock(int locknum=72090689) Line 375 C
04320069()
它发生在应用程序关闭和对象销毁进行时:有一行像'delete ptr'会导致异常。但我检查了几次代码,什么也没发现。我试过使用CRT调试功能(内存泄漏诊断,自定义内存分配挂钩等),没有结果。我还发现,当使用CRT的调试版本(在发布配置中使用多线程调试(/MTd))时,这个问题得到了解决。还有一件事:当我对代码进行一些小的修改时(例如,写一行调试代码),调用堆栈会发生变化,每次都是完全不同的。例如:
ntdll.dll!77b0206e()
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
Mapp.exe!_unlock_fhandle(int fh=72090689) Line 491 C
04320069()
和另一个
ntdll.dll!77b0206e()
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
ntdll.dll!77b0201f()
kernel32.dll!768cf1cc()
Mapp.exe!free(void * pBlock=0x024950f0) Line 51 C
Mapp.exe!CGISMapLineShape::~CGISMapLineShape() Line 20 + 0x13 bytes C++
Mapp.exe!CGISMapPolygonShape::`scalar deleting destructor'() + 0x13 bytes C++
Mapp.exe!CGISMapMultyPolygonShape::~CGISMapMultyPolygonShape() Line 9 C++
Mapp.exe!CGISMapMultyPolygonShape::`scalar deleting destructor'() + 0xc bytes C++
Mapp.exe!CGISMapShapeCollection::Clear() Line 307 C++
我知道在应用程序代码中有一些错误,但问题是我能找到它吗问题
在发布版本中,内存处理与调试版本有很大不同。当您试图访问已删除的对象时,通常会发生此错误。如果你不加载这些符号,调用栈就是垃圾
我终于明白了!这是几个错误,所有的错误——数组操作中的索引超出范围。
谢谢大家的帮助!