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) |
编辑 收藏