【问题标题】:Memory leak from curl librarycurl库的内存泄漏
【发布时间】:2012-07-15 19:31:15
【问题描述】:

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

#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 

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

【问题讨论】:

  • 您如何检测泄漏?为什么这被标记为 C?
  • 我正在运行程序,在它完成之前,windows 告诉我 testing.exe 已停止工作。我将其标记为 C,因为我正在使用 curl 中的 C api。想也许有些 C 人可能会发现问题。
  • @bryan sammon:是的,它已经完成了工作。这并不意味着存在内存泄漏。

标签: c++ curl openssh


【解决方案1】:

您应该尝试调用curl_global_init,如本手册页所述。 curl_easy_init() 会为您调用它,但在某些情况下可能会导致问题。

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

也请致电curl_global_cleanup()

【讨论】:

  • 这对我有用。 valgrind 报告的泄漏消失了。
  • @MarkLakata -- 太好了,不能说我记得 7 年前回答过这个问题,但我很高兴我回答了。 :D
【解决方案2】:

这个问题是 3 年前提出的,但问题仍然存在,所以这里是如何处理这个问题的。在curl_global_initcurl_easy_initdevelopers 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 的联机帮助页。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-28
    • 2012-01-17
    • 1970-01-01
    • 2011-05-28
    • 2010-11-17
    • 1970-01-01
    • 2012-03-02
    • 2013-12-06
    相关资源
    最近更新 更多