繁体   English   中英

为什么libcurl在清除调用之后仍然留下可访问的块?

[英]Why libcurl still leaves reachable blocks after cleanup calls?

我一直在使用libcurl来处理获取/发布请求,并且valgrind总是向我显示相同数量的可访问块(21)。 我在标准cURL的配置中缺少什么来避免这种情况?

这是带有“错误”的最简单的代码:

#include <stdio.h>
#include <stdlib.h>
#include <curl/curl.h>

int main(int argc, char const *argv[]) {

  CURL *curl;

  curl_global_init(CURL_GLOBAL_ALL);
  curl = curl_easy_init();
  ·
  ·
  ·
  curl_easy_cleanup(curl);
  curl_global_cleanup();

  return 0;

}

我编译

$ gcc -o test cURL.c -lcurl

Valgrind检查

$ valgrind --leak-check=full --track-origins=yes ./test

==4295== Memcheck, a memory error detector
==4295== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==4295== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==4295== Command: ./test
==4295== 
==4295== 
==4295== HEAP SUMMARY:
==4295==     in use at exit: 858 bytes in 21 blocks
==4295==   total heap usage: 4,265 allocs, 4,244 frees, 185,353 bytes allocated
==4295== 
==4295== LEAK SUMMARY:
==4295==    definitely lost: 0 bytes in 0 blocks
==4295==    indirectly lost: 0 bytes in 0 blocks
==4295==      possibly lost: 0 bytes in 0 blocks
==4295==    still reachable: 858 bytes in 21 blocks
==4295==         suppressed: 0 bytes in 0 blocks
==4295== Reachable blocks (those to which a pointer was found) are not shown.
==4295== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==4295== 
==4295== For counts of detected and suppressed errors, rerun with: -v
==4295== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

libcurl链接许多库,其中一些库没有curl_global_cleanup类的函数来恢复初始化并释放所有内存。 当libcurl与NSS链接以获得TLS支持以及libssh2及其对libgcrypt的使用时,就会发生这种情况。 在这方面,将GNUTLS作为TLS实现较为干净。

通常,这不是问题,因为这些辅助库仅用于在进程终止时释放内存的操作系统,因此不需要显式清理(甚至会减慢进程终止)。 仅对于某些内存调试器,清除清理例程的效果是可见的,并且valgrind通过区分实际的泄漏(没有指针的内存)和在进程终止时仍可访问的内存来处理这种情况(因此可以如果进程尚未终止,请再次使用)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM