[转] string和动态链接库——不仅仅如此

来源:互联网 发布:软件防止破解 编辑:程序博客网 时间:2024/06/02 06:38

       动态链接库是一种常用的技术,但是在和string共用的时候,通常会出现一些问题。网络上有一种说法是因为动态链接和静态链接方式不同的缘故。这样的说法经过测试好像是不对的。我测试结果是和使用的库有关。
       在测试中,使用了多种组合,发现在动态链接库和exe文件都使用动态链接的运行时库就没有问题了。这个问题究竟出在什么地方呢?
       我开始认为是多线程导致string的问题,但在明显的单线程Demo中也有问题,实验结果是静态连接C Run-time Library导致了这个问题。从网上收集到的信息很有限。比较有说服力的一个说法是在静态连接C Run-time Library的时候导致运行堆不是唯一的,因为导致删除出错。在DLL中分配的内存在exe中删除时,遇到的问题是一样的。这里是一个不太确切的说法,希望有人能给出详细介绍。


1 string和动态链接库——不仅仅如此

c++ 动态库中回调函数慎用string及容器

因而在主程序与动态库之间定义了一个共同的结构,结构里面存在这string及诸如vector,list数组,这下问题就出来了,由于使用回调函数时,结构体变量在动态库中定义,而在主程序中赋值使用,这下问题就来了,说string释放出错,访问了非法的地址,让我一顿好整,先是把string预先分配空间,如tmpstr.assgn(30, 0);的确这样是好用,但却要严格的控制赋值时不能超过这个长度,因为string超过就会自动分配新空间,以前的空间丢丢弃了,这时又跟以前一样,这个问题解决了,但又出现一个新的问题,就是vector释放不了,郁闷,开始还人为是string的问题,就将string改成了固定空间的字符数组,但结果问题依然存在,没办法了,只好多折腾。

像string类型及vector动态的空间,都是在赋值时分配空间的,这样就会导致在主程序中分配空间,而到动态库中释放,就会释放不了.



不需要 __declspec(dllexport) ,因为类成员信息已经内嵌于程序集中,不需要”导出“




0 0