当选择multi-threaded或者multi-threaded debug静态编译时,请注意,编译器会为该dll单独实现一个c++
运行库环境。这时,exe文件或者其他dll文件也使用静态编译等的时候,编译器又会实现多个c++运行库环境。在这个时侯,(由于微软的stl实现基于引用计数,)多个运行库的存在,就可能导致引用计数的错误(因为各个运行库分别计数)。
直接导致的问题就是,如果dll导出函数输入或者输出数据类型中使用了stl类时,程序有可能因为引用计数的问题而过早析构该对象,而导致后续访问野指针,应用程序崩溃。
所以当你选择静态编译的时候,记住返回的函数或者输入的参数,都不要使用stl类对象,否则程序将不稳定。
C++代码
-
- std::string getString();
-
- void getString( std::string&);
-
- void setString( const std::string&);
其他stl类库也都一样,不能作为输入或者输出的数据类型。
注:动态编译不会有这个问题,因为大家共享同一个C++运行库。