繁体   English   中英

如何正确处理由 c 中的 function 分配和交换的缓冲区

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM