微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

libcurl/C :我什么时候可以释放头和 postdata 缓冲区?

如何解决libcurl/C :我什么时候可以释放头和 postdata 缓冲区?

https://curl.se/libcurl/c/httpcustomheader.html 中有一个关于如何让 libcurl 设置自定义标头的基本示例。但是在头字符串是分配的字符数组的情况下,我不清楚何时释放它。我更喜欢 libcurl 复制我的标头字符串,这样我就可以在设置标头后立即释放它们(而不是在 perform() 或 cleanup() 之后)。

CURL *curl = curl_easy_init();
struct curl_slist *chunk = NULL;
char *header = malloc(50);
strcpy(header,"my-header: ABC");
chunk = curl_slist_append(chunk,myheader);
curl_easy_setopt(curl,CURLOPT_HTTPHEADER,chunk);
...
curl_easy_perform(curl);
// I would prefer to free here
// because I can run this curl handle with new headers
curl_easy_cleanup(curl);
curl_slist_free_all(chunk);
// shall I free here or will it be free by above call?

我对 POSTdata 有同样的问题:

char *postdata = strdup("a=1&b=2");
curl_easy_setopt(curl,CURLOPT_POST,1L);
curl_easy_setopt(curl,CURLOPT_POSTFIELDSIZE,strlen(postdata));
curl_easy_setopt(curl,CURLOPT_POSTFIELDS,postdata);
// can I free postdata here? << preferred
curl_easy_perform(curl);
// can I free here?
curl_easy_cleanup(curl);
// must I free here?

我希望 libcurl 复制 postdata 以便我可以在我自己的时间释放它,然后 libcurl 可以在它完成后释放它的副本。

有什么见解吗?

解决方法

curl_easy_setopt 的文档说明:

作为 'char *' 参数传递给 libcurl 的字符串由库复制;因此,在 curl_easy_setopt 返回后,与指针参数关联的字符串存储可能会被覆盖。

关于 CURLOPT_POSTFIELDS 内容如下:

此规则的唯一例外实际上是 CURLOPT_POSTFIELDS,但是复制字符串 CURLOPT_COPYPOSTFIELDS 的替代方法具有一些您需要阅读的使用特征。

因此,如果您希望 libcurl 复制 postdata,则需要使用 CURLOPT_COPYPOSTFIELDS 代替。

上面写着:

传递一个 char * 作为参数,它应该是要在 HTTP POST 操作中发布的完整数据。它表现为 CURLOPT_POSTFIELDS 选项,但原始数据由库复制,允许应用程序在设置此选项后覆盖原始数据。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。