DLL中使用vector的问题
问题参考:关于用DLL接中使用std::vector之后出现的问题
以前也知道有这么个问题,公司有个项目用到dll,已经定好用vector了(不是我定的,我一直都是用 struct *的参数)。
在dll函数中用到了push_back
,在主程序中之前用一个全局(跟随对话框类)变量,倒没啥问题。
这次在函数new新对象时,每次函数结束后会自动调用析构函数,就会中断到释放vector资源这里。
解决方法是,将在dll中push_back的vector 从类中拿出来(就不会被自动析构了),定义到全局中,或者设置为static。
注:如果设置static,除了头文件中的声明,还需要在实现中再定义一次, vector<SProperty> Parse::navData;
调试DLL时还需要注意的其他问题:
- Release 版本对应 Release dll; Debug 对应Debug dll,不能错开调用。
- dll生成的平台工具集要统一,我就遇到很多莫名奇妙的内存错误(创建和释放都有)【当时环境是:dll使用VS2010(v100),主程序使用VS2012(v110)】,统一改为vs2010就没有那些问题了
2022-6-24 追加:
一定要注意调试时统一版本,今天又遇到一些奇怪的问题,MessageBox报错,或者PLOG输出报错。还是版本不一致引起的。
2022-6-24 追加:
DLL中使用vector的问题,请参考 关于用DLL接中使用std::vector之后出现的问题
将DLL运行库设置为多线程DLL (\MD),主程序运行库也设置为(\MD),需要将MFC使用设置为【共享DLL中使用MFC】。
后续研究参考:crt 运行时库dll跨模块传递crt对象,出现的崩溃问题
再使用 reverse 申请内存避免DLL中申请。vector 的push_back()在release下崩溃问题
2022-11-18 追加:
也可以在DLL中push_back(),和clear()。把使用和释放放到一个地方即可,不跨DLL。