2012-07-15 44 views
1

我有问题,下面的代码编译得很好,但是当我运行它,输出文件之后,我得到了内存泄漏。curl库的内存泄漏

#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 

任何想法可能会导致此内存泄漏?

+1

您是如何检测泄漏的?为什么这个标签C? – 2012-07-15 19:32:27

+0

我正在运行该程序,并在它完成窗口告诉我testing.exe已停止工作。我将它标记为C,因为我使用curl的C api。想想也许有些C人可能会看到这个问题。 – 2012-07-15 19:35:29

+0

@bryan sammon:是的,它完成了工作。这并不意味着有内存泄漏。 – 2012-07-15 19:36:07

回答

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 

这些错误会显示在你的最终报告抑制。例如: -

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