项目中遇到一个奇怪的问题:dll外访问dll的数据会崩溃,但是在dll内部访问就正常,按照正常的逻辑应该是,只要通过dll提供的接口获取到数据的地址,就应该可以正常访问该地址下面的数据,但是这次的现象让我对以往的“经验”有了新的看法,特此记录备忘!
具体情况如下:
项目中引用了一个公司的内部dll库(MD方式编译),由于开始创建这个项目的时候修改了Release版本的编译方式,改为MDd的方式编译,这时为后面的调试埋下了炸弹,因为这种编译方式与我所引用dll库的编译方式不同,最终会导致一些奇怪的现象:
就是运行时只要在dll外部访问了dll中的数据就会崩溃,我一直很郁闷,因为之前都是没问题的,于是我开始怀疑的引用的另一个第三方开源库(restbed4.7版本),因为restbed4.7版本使用的必须是1.12.0版本的asio库,而我的项目使用的是boost1.70.0中的asio版本,我担心2个版本不一致导致的问题,后来我把所有用到restbed的地方都去掉了,并且去掉了restbed库的引用。结果还是会出现dll外访问dall中的数据会崩溃。后来实在没辙就开始逐个检查项目的工程配置项。结合这个bug的特征(dll外访问dll的数据会崩溃,但是在dll内部访问就正常),检查到“c/c++ ==> 代码生成 ==> 运行库” 的设置时才恍然大悟,原来是我之前为了调试方便,把Release版本中的MD改成了MDd。
所以在引用第三方库的时候一定要确认你的项目与所引用的库的编译方式是否一致,本次只是对MD与MDd做了测试,MT与MTd没有测试,不清楚会不会也出现这种情况,等这个项目结束之后再抽时间验证一下。