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

本文讨论了在DLL中使用STL作为接口参数时遇到的问题,特别是涉及vector和string时可能出现的内存访问异常。原因在于STL类在不同DLL之间的静态成员不同步。微软建议避免在DLL接口中传递STL容器,推荐使用指针或引用,并确保内存分配与释放对等。解决方法包括使用句柄、封装DLL内部的STL对象、自定义内存分配器或使用相同版本的STL运行库。
摘要由CSDN通过智能技术生成

STL跨平台调用会出现很多异常,你可以试试.

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

原因分析:一 句话-----如果任何STL类使用了静态变量(无论是直接还是间接使用),那么就不要再写出跨执行单元访问它的代码。 除非你能够确定两个动态库使用的 都是同样的STL实现,比如都使用VC同一版本的STL,编译选项也一样。强烈建议,不要在动态库接口中传递STL容器!!STL不一定不能在DLL间传递,但你必须彻底搞懂它的内部实现,并懂得为何会出问题。微软的解释:http://support.microsoft.com/default.aspx?scid=kb%3ben-us%3b172396微软给的解决办法:http://support.microsoft.com/default.aspx?scid=kb%3ben-us%3b1689581、微软的解释:大 部分C++标准库里提供的类直接或间接地使用了静态变量。由于这些类是通过模板扩展而来的,因此每个可执行映像(通常是.dll或.exe文件)就会存在 一份只属于自己的、给定类的静态数据成员。当一个需要访问这些静态成员的类方法执行时,它使用的是“这个方法的代码当前所在的那份可执行映像”里的静态成 员变量。由于两份可执行映像各自的静态数据成员并未同步,这个行为就可能导致访问违例,或者数据看起来似乎丢失或被破坏了。可能不太好懂,我举个例子:假如类A有个静态变量m_s,那么当1.exe使用了2.dll中提供的某个A对象时,由于模板扩展机制,1.exe和2.dll中会分别存在自己的一份类静态变量A.m_s。这 样,假如1.exe中从2.dll中取得了一个的类A的实例对象a,那么当在1.exe中直接访问a.m_s时,其实访问的是 1.exe中的对应拷贝(正确情况应该是访问了2.dll中的a.m_s)。这样就可能导致非法访问、应当改变的数据没有改变、不应改变的数据被错误地更 改等异常情形。原文:Most classes in the Standard C++ Libraries use static data members directly or indirectly. Since these classes are generated through template instantiation, each executable image (usually with DLL or EXE file name extensions) will contain its ow

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值