大龙的博客

常用链接

统计

最新评论

dll静态编译的问题 ---- 转

当选择multi-threaded或者multi-threaded debug静态编译时,请注意,编译器会为该dll单独实现一个c++ 运行库环境。这时,exe文件或者其他dll文件也使用静态编译等的时候,编译器又会实现多个c++运行库环境。在这个时侯,(由于微软的stl实现基于引用计数,)多个运行库的存在,就可能导致引用计数的错误(因为各个运行库分别计数)。

直接导致的问题就是,如果dll导出函数输入或者输出数据类型中使用了stl类时,程序有可能因为引用计数的问题而过早析构该对象,而导致后续访问野指针,应用程序崩溃。

所以当你选择静态编译的时候,记住返回的函数或者输入的参数,都不要使用stl类对象,否则程序将不稳定。

C++代码
  1. // 以std::string为示例,如下风格的函数不可用   
  2. std::string getString(); // 返回一个std::string或者std::string&   
  3.   
  4. void getString( std::string&);  //输入参数是std::string&等   
  5.   
  6. void setString( const std::string&); //同样会导致不可预料的错误,虽然输入的值是const类型的!  

 其他stl类库也都一样,不能作为输入或者输出的数据类型。

 注:动态编译不会有这个问题,因为大家共享同一个C++运行库。

posted on 2009-09-29 11:58 大龙 阅读(680) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理