Curl_easy_cleanup不会释放资源
Curl_easy_cleanup doesn't free resources
我使用libcurl
制作了一个多线程HTTP代理,问题是我的应用程序使用的RAM会随着时间的推移而增加(在响应HTTP请求后)
我确信我释放了所有动态分配的变量和libcurl
使用的头列表,并且我在每次请求后都运行curl_easy_cleanup
。但在调试我的应用程序后,我发现curl_easy_cleanup
没有释放任何东西,甚至没有一个字节(删除它后,应用程序使用相同数量的内存)
使用的内存在开始时快速增加,然后变得缓慢增加(有时根本没有增加)
应用程序释放大量内存的唯一时刻是关闭浏览器(但不是应用程序启动时使用的第一个内存量)。
Valgrind并没有明确表示内存泄漏(一些可能的内存泄漏,但只有几个字节),就像free
、curl_easy_cleanup
curl_global_cleanup
根本没有任何影响一样。
在我看来,您正在查看应用程序使用的内存总量。这种情况很少发生,而且只有在一次释放了大量内存的情况下才会发生。
这是因为应用程序使用的堆本身不会被释放,只会释放进入堆中的小块,这些小块将在下次需要该大小的块时由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左右,然后删除所有内容,但它将保持相同的大小。
相关文章:
- C++ 返回异常,我应该释放资源吗?
- 如何释放 googletest ASSERT_THROW语句中的函数使用的资源?
- 在不释放所有动态分配的资源的情况下结束程序是否有风险
- Tensorflow C++关闭会话后不释放 GPU 资源
- 谁负责释放由 std::move 移动的资源?
- 构造函数中发生异常时如何释放 API 使用的资源
- 提升 MPI 在侦听列表时不释放资源?
- 通过C接口分配和释放资源的正确习惯用法
- 正在从D3D挂钩释放资源
- 如何从shared_ptr资源管理器释放资源
- boost:scoped_ptr to boost::p tr_vector 而不释放资源
- 使用 C++/WinAPI 在对话窗口中释放资源的相应消息是什么?
- Qt UI生成器不会释放资源
- Curl_easy_cleanup不会释放资源
- 为什么OpenGL在创建/释放资源时使用指向资源id的指针
- 在不同的线程上安全地释放资源
- "new char[]"是否需要手动释放资源?
- 自动释放资源的通用句柄
- 使用信号处理程序释放资源
- 用于释放资源的异常处理的替代方法