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

本文讨论了在DLL中使用STL vector作为接口参数时可能出现的数据同步问题,原因是不同执行单元间的静态成员变量不同步。微软提供了相关解释和解决办法,建议避免在DLL接口中使用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%3b168958

1

、微软的解释:

部分

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

中的对应拷贝(正确情况应

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值