最近的一个项目中遇到了调用别人的sdk接口(dll库)而传给我的是一个vector指针,用完之后还要我来删除的情况。这个过程中首先就是在我的exe中将其vector指针转为相应指针再获取vector中相应的数据问题,始终都获得不了正确的数据,要么就是一些非法的数据;另一个问题就是delete这个指针时候会产生相应异常(针对这个问题的思考:如果EXE和DLL都链接到DLL的C/C++运行期库,那么代码将能够很好地运行.但是,如果两个模块中的一个或者两个链接到静态C/C++运行期库,那delete的操作就会失败.)。这叫一个折腾的纠结啊。搜罗了一些网络资料以备以后的参考学习:

(1)对于STL,在DLL中使用的时候,往往存在这些问题,在网络上搜集了下,这些都是要平时使用STL的时候注意的。


引用http://www.hellocpp.net/Articles/Article/714.aspx
template  是个好东西啊 . 经典的 stl . 强悍的boost. 还有我自己写的那个 ------- 该死的 ------- 资源管理器.dynamic link也是个好东西啊. 在windows下叫dll, 在unix下叫so (share object) . 它能省下很多重新发布软件带来的麻烦.但是当template  遭遇到dynamic link 时候, 很多时候却是一场恶梦.现在来说说一部分我已经碰到过的问题. 问题主要集中在内存分配上.
1>       拿STL来说, 自己写模板的时候,很难免就用到stl. stl的代码都在头文件里.  那么表示着内存分配的代码.只有包含了它的cpp 编译的时候才会被决定是使用什么样的内存分配代码. 考虑一下: 当你声明了一个vector<> . 并把这个vector<>交给一个 dll里的代码来用. 用完后, 在你的程序里被释放了.    那么如果你 在dll里往vector里insert了一些东西. 那么这个时候insert 发生的内存分配的代码是属于dll的. 你不知道这个dll的内存分配是什么. 是分配在哪里的.  而这个时候.释放那促的动作却不在dll里.....同时. 你甚至无法保证编译dll的那个家伙使用的stl版本和你是完全一样的..>      如此说来, 程序crash掉是天经地义的....        对策: 千万别别把你的stl 容器,模板容器在 dll 间传来传去 .  记住string也是....
2>       你在dll的某个类里声明了一个vector之类的容器.  而没有显式的写这个类的构造和析构函数. 那么问题又来了.     你这个类肯定有操作这vector的函数. 那么这些函数会让vecoter<>生成代码. 这些代码在这个dll里都是一致的. 但是别忘了.你没有写析构函数...... 如果这个时候, 别人在外面声明了一个这样的类.然后调用这个类的函数操作了这个vector( 当然使用者并不知道什么时候操作了vector) .  它用完了这个类以后. 类被释放掉了. 编译器很负责的为它生成了一份析构函数的代码...... 听好了.这份代码并不是在 dll里 ... . 事情于是又和1>里的一样了.... crash ......(可能还会伴随着迷茫.....)     对策: 记得dll里每个类,哪怕式构造析构函数式空的. 也要写到cpp里去. 什么都不写也式很糟糕的.....同时,更要把任何和内存操作有关的函数写到 .cpp 里...
3>     以上两个问题似乎都是比较容易的-----只要把代码都写到cpp里去, 不要用stl容器传来传去就可以了.   那么第三个问题就要麻烦的多.   如果你自己写了一个模板, 这个模板用了stl 容器..........   这个时候你该怎么办呢? 显然你无法把和内存分配相关的函数都写到.cpp里去 . template的代码都必须放到header file里.....   对策:  解决这个问题的基本做法是做一个stl 内存分配器 , 强制把这个模板里和内存分配相关的放到一个.cpp里去.这个时候编译这个cpp就会把内存分配代码固定在一个地方: 要么是dll. 要么是exe里... 模板+动态链接库的使用问题还很多. 要千万留心这个陷阱遍地的东西啊

另外,對於這種問題的解決辦法,下面3种可行办法:
1. 传递vector指针
2. 传递const vector
3. 儘量不使用stl作為dll間的傳遞參數,使用指針會更好點
究其原因:是因为vector在exe和dll之间传递的时候,由于在dll内可能对vector插入数据,而这段内存是在dll里面分配的,exe无法知道如何释放内存,从而导致问题。而改成const类型后,编译器便知道dll里不会改变vector,从而不会出错。或者可以说这是"cross-DLL problem."(This problem crops up when an object is created using new in one dynamically linked library (DLL) but is deleted in a different DLL)的一种吧。

(2) 从一个可执行程序中输出模板实例,在另一个可执行程序中引入此实例。例如:MyLibrary.DLL将vector <MyClass> 指针回传给MyProgram.EXE中的一个函数,需要在MyLibrary.DLL中输出MyClass类和vector <MyClass> 。在MyProgram.EXE中引入它们后。就可以得到MyLibrary.DLL中静态数据成员的一份Copy了。

这个是解决我这个问题的挺不错的方法,但是并为给予采纳和验证。毕竟为了保险起见最终还是选择了数组传递数据,但是还是要给予的原则是谁创建谁释放。否则还是会出问题我这里即便是调用delete[ ]objArray;这里的delete的并不知道要删除多大的内存,而这个要删除多大的内存信息是在dll中保存着的,那个dll中的delete才知道。DLL中分配的内存DLL要负责释放!(一个模块分配的内存要在同一个模块中释放!)

vector作为参数传递到dll问题相关推荐

  1. matlab vector函数参数,将vector作为参数传递

    这两天在用c++写数值计算,手残选了个蛋疼的Boost库.boost的好处在于通用性,缺点--原型实在是太长了,make一下只要出一个error就被刷屏了(偶17寸屏幕18号字,谁让我是瞎子). 首先 ...

  2. c++内存管理的一些资料

    C++内存分配方式详解--堆.栈.自由存储区.全局/静态存储区和常量存储区 如何动态调用DLL中的导出类 在dll中导出类,并结合继承带来的问题 如何更好的架构一个界面库,欢迎大家一起讨论 pimpl ...

  3. vector 作为dll 接口参数_DLL中传递STL参数,vector对象作为dll参数传递等问题(转)...

    STL使用模板生成,当我们使用模板的时候,每一个EXE,和DLL都在编译器产生了自己的代码,导致模板所使用的静态成员不同步,所以出现数据传递的各种问题,下面是详细解释. 原因分析:一句话-----如果 ...

  4. DLL中传递STL参数(如Vector或者list等)会遇到的问题[转载]

    最近的一个项目中遇到了调用别人的sdk接口(dll库)而传给我的是一个vector指针,用完之后还要我来删除的情况.这个过程中首先就是在我的exe中将其vector指针转为相应指针再获取vector中 ...

  5. java.util.vector中的vector的详细用法

    ArrayList会比Vector快,他是非同步的,如果设计涉及到多线程,还是用Vector比较好一些  import java.util.*; /**  * 演示Vector的使用.包括Vector ...

  6. vector用法 java_java.util.vector中的vector的详细用法

    /** *演示Vector的使用.包括Vector的创建.向Vector中添加元素.从Vector中删除元素.*统计Vector中元素的个数和遍历Vector中的元素.*/ public class ...

  7. Vector在Java编程中的应用

    Vector 类提供了实现可增长数组的功能,随着更多元素加入其中,数组变的更大.在删除一些元素之后,数组变小. Vector 有三个构造函数, public Vector(int initialCap ...

  8. delphi dll创建及调用

    第一章 DLL简单介绍 由于在目前的学习工作中,需要用到DLL文件,就学习了下,在这里作个总结. 首先装简单介绍下DLL: 1,减小可执行文件的大小 DLL技术的产生有很大一部分原因是为了减小可执行文 ...

  9. DLL资料(一) (转载)

    LL资料(一)2008-07-08 16:49第一篇文章:关于INNO,让您更喜欢INNO, 异构数据库之间完全可以用SQL语句导数据 海量数据库的查询优化及分页算法方案 ClientDataSet的 ...

最新文章

  1. 计算两个字符串之间是否包含的简单方法
  2. 百度网页分享js代码
  3. Java_异常_03_ java.lang.NoClassDefFoundError: org/apache/commons/pool/KeyedObjectPoolFactory
  4. PyCharm没有run选项,只有run nosetests in XXX
  5. 网络虚拟化是否需要额外的网络架构?
  6. 暑训day1解题报告
  7. 【转载】linux环境下tcpdump源代码分析
  8. Golang--defer的mi魂汤
  9. 如何优化你的布局层级结构之RelativeLayout和LinearLayout及FrameLayout性能分析(二)...
  10. 利用Python获取数组或列表中最大的N个数及其索引
  11. TCL电视禁止第三方安装软件?如何远程给安卓智能电视强制安装安卓所有软件?
  12. VMware虚拟文件(.vmdk)瘦身(宿主为Windows)
  13. S-CMS医院建站系统XXE通用漏洞的利用与防御
  14. ubuntu18.04+opencv3.4.10+opencv3.4.10contrib+LSD使用
  15. pip2 python2.7 安装opencv-python cv2遇到问题的可能解决办法 skbuild list(pattern)
  16. 指针--指针的创建和指针的大小
  17. 创客平台靠什么盈利?
  18. 湖北省211大学计算机分数线,2017年211高校各省市录取分数线汇总
  19. 病毒木马查杀实战第026篇:“白加黑”恶意程序研究(上)
  20. 什么是class-agnostic,class-agnostic是什么意思

热门文章

  1. Collections集合工具类的方法_sort(List)
  2. 斗地主案例的需求分析
  3. 初始springCloud
  4. 数据库-索引-普通索引-唯一索引
  5. 使用rmi实现ehcache集群模式
  6. aop实现原理-动态代理CGLib代理
  7. php将数组中元素打乱顺序,PHP公开课|学会随机打乱数组元素顺序的函数,你的PHP会学的更好...
  8. JUnit 5 常用注解与方法
  9. 你真的会搜索?低效的你简直在浪费生命(三)(终结篇)
  10. 2017 JMP Discovery Summit China圆满落幕