curl库内存泄漏

Memory leak from curl library

本文关键字:泄漏 内存 curl      更新时间:2023-10-16

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

#include <iostream>
#include "includecurlcurl.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: %sn",
                    curl_easy_strerror(res));
        /* always cleanup */ 
        curl_easy_cleanup(curl);
    }
    return 0;
}

我正在windows vista机器上编译它w/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 

知道是什么原因导致了内存泄漏吗?

您应该按照本手册页中的说明尝试调用curl_global_init。curl_easy_init()会为您调用它,但在某些情况下可能会导致问题。

http://curl.haxx.se/libcurl/c/curl_easy_init.html

也可调用curl_global_cleanup()

这个问题是3年前提出的,但问题仍然存在,下面是如何处理这个问题。在curl_global_initcurl_easy_init之后仍然有可访问内存,开发人员已经意识到了这一点。但是,由于它没有增长,目前没有理由仅仅为了让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

然后,错误将显示为在您的最终报告中被抑制。例如:

==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的手册页。