我有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.

09-06 23:02