linux 释放内存块,Linux分配器不会释放小块内存

Linux glibc分配器似乎行为怪异。希望有人能够对此有所了解。下面是我的源文件:Linux分配器不会释放小块内存

first.cpp:

#include

#include

#include

#include

int main() {

std::list ptrs;

for(size_t i = 0; i < 50000; ++i) {

ptrs.push_back(new char[1024]);

}

for(size_t i = 0; i < 50000; ++i) {

delete[] ptrs.back();

ptrs.pop_back();

}

ptrs.clear();

sleep(100);

return 0;

}

second.cpp:

#include

#include

#include

int main() {

char** ptrs = new char*[50000];

for(size_t i = 0; i < 50000; ++i) {

ptrs[i] = new char[1024];

}

for(size_t i = 0; i < 50000; ++i) {

delete[] ptrs[i];

}

delete[] ptrs;

sleep(100);

return 0;

}

我编译两个:

$ g++ -o first first.cpp

$ g++ -o second second.cpp

我第一次运行,并且在它睡觉之后,我看到驻留内存大小:

当我编译first.cpp,并运行它,我看内存PS:

$ ./first&

$ ps aux | grep first

davidw 9393 1.3 0.3 64344 53016 pts/4 S 23:37 0:00 ./first

$ ./second&

$ ps aux | grep second

davidw 9404 1.0 0.0 12068 1024 pts/4 S 23:38 0:00 ./second

通知的常驻内存的大小。首先,常驻内存大小为53016k。其次是1024k。首先从未将分配由于某种原因释放回内核。

为什么第一个程序不会放弃内存到内核,但第二个程序呢?我知道第一个程序使用链接列表,并且链接列表可能会在与我们正在释放的数据相同的页面上分配一些节点。但是,应该释放这些节点,因为我们将这些节点弹出,然后清除链接列表。如果你通过valgrind运行这些程序中的任何一个,它就会返回而不会发生内存泄漏。可能发生的情况是内存在first.cpp中被分割,而不在second.cpp中。但是,如果页面上的所有内存都已释放,那么该页面如何不会被释放回内核?内存需要放回内核需要什么?如何修改first.cpp(继续将char *放在列表中),以便将内存交给内核。

+2

使用缩小以适合,描述这里](http://stackoverflow.com/questions/5834754/stddeque-does-not-release-memory-until-program-exits)。在这种情况下,请执行'std :: list ().swap(ptrs)'。 –

+1

这里是我的新程序:这里是我的新程序: int main(){ { std :: list ptrs; (size_t i = 0; i <50000; ++ i){ ptrs.push_back(new char [1024])的 ;对于(size_t i = 0; i <50000; ++ i){ } delete [] ptrs.back(); ptrs.pop_back(); } ptrs.clear(); std ::列表().swap(ptrs); } sleep(100); return 0; } 运行ps有相同的结果: davidw 9961 0.0 0.3 64344 53016 pts/4 S 00:31 0:00 ./first –

+0

为什么被标记为C? –

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值