gpt4 book ai didi

c++ - curl_easy_cleanup 不释放资源

转载 作者:行者123 更新时间:2023-11-28 07:31:51 30 4
gpt4 key购买 nike

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

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

使用的内存一开始增长很快,然后慢慢增长(有时根本不增长)

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

Valgrind 并没有发出明确的内存泄漏信号(一些可能的内存泄漏,但只是几个字节),就像 free, curl_easy_cleanup curl_global_cleanup完全没有任何影响。

最佳答案

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

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

换句话说,您看到的是应用程序内存使用的“高水位线”会上升一段时间,直到它稳定在某个水平。这就是为什么 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++ - curl_easy_cleanup 不释放资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17516708/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com