在跨模块调用中传递stl容器的问题。

在跨模块调用中传递stl容器的问题。
这是在项目中碰到的。
下面是代码:
// de.cpp
#include  < string >
#include 
< iostream >
using   namespace  std;
extern   " C "   void  getString( string   & str);

int  main( int  argc, char   ** argv)
{
    
string  str;
    getString(str);
    cout 
<<  str;
    
return   0 ;
}

// dll.cpp
#include  < string >
#include 
< iostream >
using   namespace  std;
extern   " C "   void  getString( string   & str)
{
    
int  i;
    
str  +=   "string modified.mybe cause a exception. " ;
}

将dll.cpp连接成dll形式,运行de.exe有时候很正常,但有时候会发现有异常出现,异常是delete释放了一个非法的指针。这取决于连接的运行库是动态的还是静态的,他会在静态连接时出问题。
产生这个问题的原因是因为std::string类的内存分配器分配了内存,而在de.cpp里释放,两个模块分别有自己的运行堆,分配和释放没有在同一个堆里进行。
原因很简单,但是有时后就会忽略,尤其在模块很多和频繁使用stl容器的时候,当从别人那里得到一个模块接口时,如果有一个需要stl容器引用的接口时就要注意运行库的问题。

你可能感兴趣的:(在跨模块调用中传递stl容器的问题。)