伟哥的博客

一个IT从业者

« | »

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

davidyu720 | 26 五月, 2008 14:33

关键字: 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上运行用单线程运行库连接的程序,长时间运行也不出错呢?

最新回复

Comment Icon re: 动态内存分配new发生访问异常

it is me | 05/06/2008, 11:52

补:在单核CPU上运行用单线程运行库连接的程序:
1)WinXP: 也会出现HeapAlloc/HeapFree方面的错误;
2)Win2K: 运行1天也没有观察到错误。

看来是WINXP与WIN2K的多线程调度机制有所不同。

发表评论

authimage

 
Accessible and Valid XHTML 1.0 Strict and CSS
Powered by pLog - Design by BalearWeb