我遇到了麻烦,下面的代码编译得很好,但是当我运行它时,在输出文件之后,我得到了内存泄漏。
#include <iostream>
#include "include\curl\curl.h"
int main(void)
{
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "https://api.del.icio.us/dt");
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, true);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2);
curl_easy_setopt(curl, CURLOPT_CAINFO, "C:\\Users\\bryan\\GeoTrustGlobalCA.crt");
/* Perform the request, res will get the return code */
res = curl_easy_perform(curl);
/* Check for errors */
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));
/* always cleanup */
curl_easy_cleanup(curl);
}
return 0;
}
我正在使用以下命令在Windows Vista机器上使用gcc 4.7.0进行编译:
g++ -DCURL_STATICLIB testing.cpp -L lib -lcurl -lidn -lwldap32 -lssh2 -lz -lrtm -lcrypto -lgdi32 -lws2_32 -lwinmm -lssl -leay32 -liconv -o testing.exe
知道可能导致此内存泄漏的原因吗?
答案 0 :(得分:2)
您应该尝试按照此手册页中的说明调用curl_global_init
。 curl_easy_init()会为你调用它,但在某些情况下可能会导致问题。
http://curl.haxx.se/libcurl/c/curl_easy_init.html
同时致电curl_global_cleanup()
。
答案 1 :(得分:1)
这个问题是在3年前提出来的,但问题仍然存在,所以我们将如何处理这个问题。在curl_global_init
和curl_easy_init
以及developers are aware of it之后仍然可以访问内存。然而,由于它没有增长,目前没有理由修复它只是为了让valgrind停止抱怨。
您可以使用抑制文件中的以下位来抑制来自curl的这些错误。
{
<insert_a_suppression_name_here>
Memcheck:Leak
match-leak-kinds: reachable
...
fun:curl_global_init
...
}
{
<insert_a_suppression_name_here>
Memcheck:Leak
match-leak-kinds: reachable
...
fun:curl_easy_init
...
}
然后您可以像这样使用抑制文件:
valgrind --suppressions=my_supp_file.supp my_binary
然后,错误将在最终报告中显示为已抑制。 e.g:
==15518== LEAK SUMMARY:
==15518== definitely lost: 0 bytes in 0 blocks
==15518== indirectly lost: 0 bytes in 0 blocks
==15518== possibly lost: 0 bytes in 0 blocks
==15518== still reachable: 0 bytes in 0 blocks
==15518== suppressed: 328 bytes in 11 blocks
顺便说一句,如果你想要抑制其他警告,你可以找到如何使用valgrind的--gen-suppressions
参数来抑制它们。有关详细信息,请参阅valgrind的联机帮助页。