curl库中的内存泄漏

时间:2012-07-15 19:31:16

标签: c++ curl openssh

我遇到了麻烦,下面的代码编译得很好,但是当我运行它时,在输出文件之后,我得到了内存泄漏。

#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 

知道可能导致此内存泄漏的原因吗?

2 个答案:

答案 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_initcurl_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的联机帮助页。