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。

posted @ 2022-06-13 14:21  姜小豆  阅读(487)  评论(0编辑  收藏  举报