我正在尝试创建一个C风格的DLL接口,它接受输入char *并在执行一些转换操作后分配输出char *。函数的返回值是错误代码,因此它不会用于返回char *。
我以这种方式调用函数:
char* output;
myfunc((char *) input.c_str(), &output);
该功能定义为:
DLL_EXPORT int myfunc(char* input, char** output)
{
string translation = translate(input);
*output = (char *) malloc((translation.length()+1)*sizeof(char));
strcpy(*output,(char *) translation.c_str());
}
这是实现此目的的正确方法吗?我是否在创建内存泄漏?
答案 0 :(得分:2)
这是正确的,但你还需要提供另一个释放内存的DLL函数。您不能假设已加载DLL的可执行文件使用相同版本的C运行时库,因此如果它尝试在返回的内存上调用free
,您可能最终会因为差异而损坏堆不同运行时的malloc
/ free
实现。
您的API应如下所示:
DLL_EXPORT int myfunc(char* input, char** output)
{
...
*output = malloc(...);
...
}
DLL_EXPORT void myfunc_free(char *output)
{
free(output);
}
答案 1 :(得分:0)
永远不要假设您将通过调用app和dll使用相同的堆空间。在这种情况下,您必须使用Windows Shared Memory object