ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 动态内存分配new发生访问异常

动态内存分配new发生访问异常

原创 Linux操作系统 作者:davidyu720 时间:2019-05-31 10:12:05 0 删除 编辑

关键字: HeapAlloc 0xC0000005 Access Violation

对于new/delete,CRT最终调用HeapAlloc/HeapFree来实现。

最近发现一个很早以前开发的程序偶尔会出现奇怪的0xC0000005异常。用drwtsn32日志定位到以前的一个DLL中:该DLL调用了NTDLL的0x7C9305D4处的代码,然后就出现了异常。对该处代码进行分析,发现是HeapAlloc的入口。

用debug版本的DLL运行程序,捕获到异常,stack显示是new调用HeapAlloc时出现异常。看到CRT源码中有#ifdef _MT,感觉跟多线程有关;查DLL工程设置:使用的是单线程运行库。


编写测试程序:多个线程同时new/delete,编译选项为单线程运行库。(因为该编译选项,因此只能用CreateThread创建线程,不能用_beginthread创建)。

在双核CPU上运行程序,立即出现类似的错误;
在单核CPU上运行程序,长时间运行也不出错;

修改编译选项为多线程库,编译,程序在双核CPU上运行正常。

自此问题基本解决。

待解疑问:为何在单核CPU上运行用单线程运行库连接的程序,长时间运行也不出错呢?

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9844649/viewspace-580110/,如需转载,请注明出处,否则将追究法律责任。

下一篇: 初次登录METALINK
请登录后发表评论 登录
全部评论

注册时间:2007-08-18

  • 博文量
    204
  • 访问量
    153446