【问题标题】:Access violation in mlockmlock 中的访问冲突
【发布时间】:2011-08-12 14:39:01
【问题描述】:

我有一个控制台应用程序(使用 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()  

当应用程序关闭并且对象销毁进行时发生:有一行像“删除 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 代码中存在一些错误,但问题是我能找到它吗 问题

【问题讨论】:

  • 如果不看代码,这几乎是不可能解决的。如果我是你,我会从寻找未初始化的变量和双重删除开始。
  • 肯定是某处的内存覆盖。您可以仔细检查您的代码是否有双重删除,写入分配空间的末尾或开头或类似的东西。在linux上你也可以通过valgrind运行你的程序,我不确定windows的替代品是什么。

标签: c++ access-violation release-mode


【解决方案1】:

在发布版本中,内存处理与调试版本有很大不同。当您尝试访问已删除的对象时,通常会发生此错误。如果你不加载符号,调用堆栈就是废话。

【讨论】:

    【解决方案2】:

    我终于咳嗽了! 这是几个错误,而且都是 - 数组操作中的索引超出范围。

    感谢大家的帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多