您的位置:首页 > 其它

跨dll使用template/STL需要注意的问题

2010-07-17 15:09 267 查看
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里...
模板+动态链接库的使用问题还很多. 要千万留心这个陷阱遍地的东西啊
(摘自Hellocpp)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: