0

我使用 制作了一个多线程 HTTP 代理libcurl,问题是我的应用程序使用的 RAM 随时间增加(在响应 http 请求后)

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

使用的内存在开始时迅速增加,然后逐渐增加(有时根本不增加)

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

Valgrind 并没有明确表示内存泄漏(一些可能的内存泄漏,但只有几个字节),就像freecurl_easy_cleanup curl_global_cleanup根本没有任何影响。

4

1 回答 1

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 左右,然后删除所有内容,但仍将保持相同大小。

于 2013-07-07T21:52:08.337 回答