[英]How to correctly handle buffer allocated and exchanged by a function in c
我在 dll 中调用导出函数,但我不知道我是否正确执行。 我总是在主机和库 function 之间传递 (void *)。 在主机应用程序中,我分配缓冲区并从 dll function 读取一个(字符 *)。
主人
char *buffer = (char *)malloc(1024);
char *param = "Hello world";
// funcPtr is the pointer to the dll function below (for e.g)
strcpy(buffer, (void *)(funcPtr)((void *)param));
// i can free the buffer here
free(buffer);
dll
__declspec(dllexport) void* test(void *param) {
char *data = (char *)param;
int len = strlen(data);
char *buffer = (char *)malloc(len + 1);
strcpy(buffer, data);
buffer[len] = '\0';
return (void *)buffer;
// but how do i free buffer here?
}
所以我分配缓冲区两次,对吧? 一旦在主机和库中,我可以在复制后释放主机中的缓冲区,但我如何处理 dll 中分配的缓冲区? FreeLibrary 不会立即释放 dll 并保留在 memory 中(也许此信息有用)。
它创建了字符串的副本,因此它必须分配新的 memory。
它还返回指向 memory 的指针,因此就像您对buffer
所做的那样,您可以调用free
,它不必在与分配它的位置相同的 scope 中调用。
请注意,此 function 允许您制作字符串文字的可写副本,因此您无法修改它们的值。
char* literal_str = "i am literal";
char* dynmic_str = test(literal_str);
// ... do stuff ...
free(dynamic_str);
// no need to free the literal_str
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.