【问题标题】:Calling malloc() from unmanaged DLL called within managed DLL generates access violation从托管 DLL 中调用的非托管 DLL 调用 malloc() 会产生访问冲突
【发布时间】:2011-09-24 17:32:28
【问题描述】:

我有一套用 C++/CLI 编写的测试,它们调用本地 DLL 以远程测试 Windows CE 设备。在测试设置过程中的两个时间点,本机堆上的内存被分配——一次分配 512 字节,另一次分配 572 字节。在这两种情况下,malloc() 最终都会使用 CRT 堆调用 HeapAlloc()。 CRT 堆的句柄在调用之间没有改变。用于分配 572 字节的调用失败,出现异常 0xc0000005(如果需要,我可以尝试提供代码示例,但必须弄清楚哪些示例足够通用,不会破坏 NDA)。

【问题讨论】:

  • @ildjarn 不同意。尝试分配内存时出现访问冲突是应用程序/进程中某些内容覆盖不应覆盖的内容的常见迹象(例如,写入分配块的末尾、写入无效指针、多次释放块等.).
  • 我同意@jdigital,特别是当发生堆损坏时分配函数可能会崩溃(@jdigital 列出了几个可能的原因)。
  • (在没有动机的情况下重复我的问题,因为动机得到的反馈比问题本身更多。)你能在另一台机器上重现这个问题,还是只在一台机器上发生?

标签: .net c++-cli malloc heapalloc


【解决方案1】:

考虑使用调试 malloc。 Here's an article 关于使用 DevStudio 调试模式来替代 malloc 和 free 的特殊调试版本。

【讨论】:

    【解决方案2】:

    看起来最终解决问题的不是使用 C 运行时堆,而是使用 GetProcessHeap() 或本地堆来进行分配。

    【讨论】:

    • 程序是在调试模式下编译的,由于某种原因 HeapAlloc 导致了 AV(这不应该发生)。围绕 HeapAlloc() 和 HeapFree() 编写我自己的包装器似乎已经停止了崩溃,尽管我失去了一定的调试能力,除非我想编写自己的 malloc 跟踪代码,这将是完全不同的失眠症。跨度>
    猜你喜欢
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    • 2010-11-02
    • 2011-03-04
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    相关资源
    最近更新 更多