2

問題が発生しました。以下のコードは正常にコンパイルされますが、実行すると、ファイルが出力された後にメモリ リークが発生します。

#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 

このメモリリークの原因は何ですか?

4

2 に答える 2

4

curl_global_initこの man ページで説明されているように呼び出してみてください。curl_easy_init() はそれを呼び出しますが、場合によっては問題が発生する可能性があります。

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

も呼び出しますcurl_global_cleanup()

于 2012-07-15T19:35:32.960 に答える
1

この質問は 3 年前に尋ねられましたが、問題はまだ存在するため、この問題に対処する方法を次に示します。と の後にまだ到達可能なメモリがcurl_global_initありcurl_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 のマンページを参照してください。

于 2016-06-12T04:42:32.173 に答える