我有一个控制台应用程序(使用MS VS2010 SP1编写)。 没有MFC,没有ATL,只是标准库。 在调试版本中,一切正常。 但在发布版本中存在访问冲突: “Mapp.exe中0x77b0206e的第一次机会异常:0xC0000005:访问冲突读取位置0x002cef58”。mlock中的访问冲突
如果我从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()
它的发生,当应用程序被关闭和破坏对象的收益:有像“删除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++
据我所知,有在fpplication代码中的一些错误,但问题是有,我可以找到它 问题
如果不查看代码,这几乎是不可能解决的。如果我是你,我会开始寻找未初始化的变量和双重删除。 – molbdnilo
绝对是内存覆盖的地方。你可以仔细检查你的代码是否有双重删除,写入超过分配空间的末端或开始或类似的东西。在Linux上,你也可以通过valgrind运行你的程序,我不知道什么是Windows的替代品。 – Torp