首页 > 解决方案 > 如何正确处理由c中的函数分配和交换的缓冲区

问题描述

我在 dll 中调用导出的函数,但我不知道我是否正确执行。我总是在主机和库函数之间传递 (void *)。在主机应用程序中,我分配缓冲区并从 dll 函数中读取 (char *)。

主人

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 并保留在内存中(也许此信息很有用)。

标签: cbuffer

解决方案


它创建了字符串的副本,因此它必须分配新的内存。

它还返回一个指向该内存的指针,所以就像你对你所做的那样buffer,你可以调用free它,它不必在与分配它的位置相同的范围内调用。

请注意,此函数允许您制作字符串文字的可写副本,因此您无法修改它们的值。

char* literal_str = "i am literal";
char* dynmic_str = test(literal_str);
// ... do stuff ...
free(dynamic_str);
// no need to free the literal_str

推荐阅读