2012-07-15 45 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的手冊頁。