我有2个动态库:dllA和dllB
dllA将(char *类型)放入dllB的1个函数,该函数为char* type
分配内存,并将结果返回给dllA。
DLLB:
getResult(char *rs)
{
// calculate to get length
rs = new char[lenght];
rs = .... // do something here
}
dllA得到结果,对输出和发布rs做一些事情。
DLLA:
getResult(char *rs);
std::cout << rs;
// can not release rs here
if(rs){
delete []rs;
} // crash here
但是我不能释放
char* type
可能是因为char* type
的内存在dllB的内存中,并且我们无法访问此内存空间。如果我使用调试模式构建,它将正常工作。并导致释放模式错误
最佳答案
每个DLL通常都实现自己的堆跟踪,因此由一个DLL分配的内存必须由同一DLL释放。通常通过提供相应的自由功能来完成此操作。即在上面的示例中,您可以执行以下操作(还请注意,rs参数必须作为指针传递给指针,以便我们可以在其中返回值):
DllB:
void getResult(char **rs)
{
// calculate to get length
*rs = new char[lenght];
rs = .... // do something here
}
void freeResult(char* rs)
{
delete [] rs;
}
DllA:
getResult(char *rs);
std::cout << rs;
freeResult(rs); // don't crash here :-)
为了确保DllA始终调用freeResult,您可以将其包装在智能指针中,例如boost :: shared_ptr或std :: shared_ptr(尽管我尚未测试过std :: shared_ptr):
DllB:
char* getResult()
{
// calculate to get length
char* rs = new char[length];
rs = .... // do something here
return rs;
}
void freeResult(char* rs)
{
delete [] rs;
}
DllA:
shared_ptr<char> rs(getResult(), freeResult);
std::cout << rs;
// no need to free rs here, the shared_ptr will do it automatically.