Curl_easy_cleanup不释放资源

时间:2013-07-07 21:46:46

标签: c++ memory-management memory-leaks free libcurl

我使用libcurl创建了一个多线程HTTP代理,问题是我的应用程序使用的RAM会随着时间的推移而增加(在响应http请求之后)

我确定我释放了动态分配的所有变量,以及libcurl使用的标头列表,我也在每次请求后运行curl_easy_cleanup。但是在调试我的应用程序之后,我发现curl_easy_cleanup并没有释放任何东西甚至一个字节(删除后,应用程序使用相同数量的内存)

用过的记忆在开始时迅速增加然后变得缓慢增加(有时根本不会增加)

应用程序释放大量内存的唯一时刻是关闭浏览器时(但不是应用程序启动时使用的第一个数量)。

Valgrind没有发出明确的内存泄漏信号(一些可能的内存泄漏,但只有几个字节),它就像freecurl_easy_cleanup curl_global_cleanup没有&#39 ; t有任何影响。

1 个答案:

答案 0 :(得分:1)

听起来我正在查看应用程序使用的内存总量。这种情况很少发生,只有在一次性释放大量内存时才会发生。

这是因为应用程序使用的堆本身不会被释放,只有进入堆的小块,下次需要时将被newmalloc重用那个大小的块。

换句话说,你所看到的是应用程序内存使用量的“高水印”会持续一段时间,直到它达到某种程度。这就是为什么valgrind没有检测到任何东西 - 你实际上并没有“泄漏”,你只是在堆积,直到它可以容纳你在程序运行期间所做的所有分配。

您可以尝试以下代码:

#include <iostream>

using namespace std;

int main()
{
   int *mem[10000];
   string dummy;
   for(int i = 0; i < 10000; i++)
   {
      mem[i] = new int [256];  // 1KB of memory. 
   }
   cout << "Hit enter to continue..." << endl;
   cin >> dummy;
   for(int i = 0; i < 10000; i++)
   {
      delete [] mem[i];
   }
   cout << "Hit enter to exit..." << endl;
   cin >> dummy;

}

您将看到应用程序增长到10MB左右,然后删除所有内容,但它将保持相同的大小。