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
中的对应拷贝(正确情况应