c - 如何正确处理由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 并保留在内存中(也许此信息很有用)。
解决方案
它创建了字符串的副本,因此它必须分配新的内存。
它还返回一个指向该内存的指针,所以就像你对你所做的那样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
推荐阅读
- laravel - 自定义注册控制器中的 Laravel 电子邮件验证不起作用
- python-3.x - 为什么 Keras 会告诉我“ValueError: setting an array element with a sequence”。尽管所有数组都是 numpy 数组?
- node.js - Linux Node JS 在端口 80 上侦听,但不在其他端口上
- mysql - 计算日期之间的平均、最小、最大间隔
- css - 样式相同但颜色可变的div
- jquery - 滚动时的jQuery动画粘性标题 - 交换图像问题
- python - 为什么 numpy.polynomial.laguerre.laggauss 不能使用超过 185 点进行积分
- java - 需要帮助理解 logcat 消息 ClassCastException
- python - Pyephem 本地时间问题
- ios - 使用 Alamofire 将图像作为 base64String 上传