我使用libcurl
创建了一个多线程HTTP代理,问题是我的应用程序使用的RAM会随着时间的推移而增加(在响应http请求之后)
我确定我释放了动态分配的所有变量,以及libcurl
使用的标头列表,我也在每次请求后运行curl_easy_cleanup
。但是在调试我的应用程序之后,我发现curl_easy_cleanup
并没有释放任何东西甚至一个字节(删除后,应用程序使用相同数量的内存)
用过的记忆在开始时迅速增加然后变得缓慢增加(有时根本不会增加)
应用程序释放大量内存的唯一时刻是关闭浏览器时(但不是应用程序启动时使用的第一个数量)。
Valgrind没有发出明确的内存泄漏信号(一些可能的内存泄漏,但只有几个字节),它就像free
,curl_easy_cleanup
curl_global_cleanup
没有&#39 ; t有任何影响。
答案 0 :(得分:1)
听起来我正在查看应用程序使用的内存总量。这种情况很少发生,只有在一次性释放大量内存时才会发生。
这是因为应用程序使用的堆本身不会被释放,只有进入堆的小块,下次需要时将被new
或malloc
重用那个大小的块。
换句话说,你所看到的是应用程序内存使用量的“高水印”会持续一段时间,直到它达到某种程度。这就是为什么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左右,然后删除所有内容,但它将保持相同的大小。