首页 > Linux操作系统 > Linux操作系统 > 动态内存分配new发生访问异常
关键字: 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博客 ” ,链接:https://blog.itpub.net/9844649/viewspace-580110/ ,如需转载,请注明出处,否则将追究法律责任。