最近在开发一个项目,有比较多的dll模块,以前测试时一直没有发现问题,运行的很正常。今天要发布一个新版本了,就用Bounders Check检查了一下。乖乖,很多错误阿!全部都是:
Allocation Conflict: Attempting to call global_operator_delete on 0x01566E68; pointer was allocated by malloc.
真是奇怪了,看了n多代码,找不出问题所在,并且这个错误是在pair<string,string> 发现的,好像根本就不是我的问题。
又经历了n多回的看。。。。。。。
最后终于发现问题了。原来我所有dll模块在生成时用的是多线程调试(/MDd), 但是我的exe也就是访问dll的模块是用单线程调试(/MLd)生成的,但是有意思的是我有一个测试程式也是用“单线程调试(/MLd)”生成的,运行时确很正常。
问题解决了,小结一下:
(1)所有的模块,包括dll/exe等,都需要统一的“C Run-Time(CRT) library ” !!!!
(2)BoundersChecker真的很管用,能帮你找出很多问题,甚至是很多你都没有意识/察觉到的问题。
(3) MSVCR71.DLL(C run-time library (without iostream or standard C++ library) ) 和 MSVCP71.dll(Standard C++ Library) 访在和exe文件的同一目录下时,BounderChecker也会报 “Allocation Conflict: Attempting to call global_operator_delete on 0x01566E68; pointer was allocated by malloc.”这个错误。
MSVCR71.DLL : C run-time library (without iostream or standard C++ library)
MSVCP71.dll : Standard C++ Library)
附:
http://www.cnblogs.com/Frodo/archive/2008/02/04/1064267.html