随笔-1  评论-6  文章-0  trackbacks-0
  2005年11月24日
这是在项目中碰到的。
下面是代码:
//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容器引用的接口时就要注意运行库的问题。
posted @ 2005-11-24 10:24 psysun 阅读(3266) | 评论 (6)编辑 收藏
仅列出标题