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按照此手册页中的说明进行调用。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开发人员意识到了这一点。但是,由于它没有增长,目前没有理由仅仅为了让 valgrind 停止抱怨而修复它。curl_easy_init

您可以使用抑制文件中的以下位来抑制来自 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 回答