Curl_easy_cleanup不会释放资源

Curl_easy_cleanup doesn't free resources

本文关键字:释放资源 cleanup easy Curl      更新时间:2023-10-16

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

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

使用的内存在开始时快速增加,然后变得缓慢增加(有时根本没有增加)

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

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

在我看来,您正在查看应用程序使用的内存总量。这种情况很少发生,而且只有在一次释放了大量内存的情况下才会发生。

这是因为应用程序使用的堆本身不会被释放,只会释放进入堆中的小块,这些小块将在下次需要该大小的块时由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左右,然后删除所有内容,但它将保持相同的大小。