免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: ideawu
打印 上一主题 下一主题

[C++] 如何让 STL 确实释放内存 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-05-31 23:39 |只看该作者
原帖由 ideawu 于 2008-5-31 23:28 发表

我在Windows XP下, 用系统自带的监视器查看. 如果用 VC6 来编译上面的程序, 可以观察到 delete m 后, 系统内存占用明显下降. 用 cygwin 环境时, 是贴子中的情况.

没这环境,无法验证,不过,我还是觉得不太可能,你可以把数设小点,再观察下

论坛徽章:
39
2017金鸡报晓
日期:2017-02-08 10:39:4219周年集字徽章-周
日期:2023-04-15 12:02:2715-16赛季CBA联赛之深圳
日期:2023-02-16 14:39:0220周年集字徽章-年
日期:2022-08-31 14:25:28黑曼巴
日期:2022-08-17 18:57:0919周年集字徽章-年
日期:2022-04-25 13:02:5920周年集字徽章-20	
日期:2022-03-29 11:10:4620周年集字徽章-年
日期:2022-03-14 22:35:1820周年集字徽章-周	
日期:2022-03-09 12:51:3220周年集字徽章-年
日期:2022-02-10 13:13:4420周年集字徽章-周	
日期:2022-02-03 12:09:4420周年集字徽章-20	
日期:2022-01-25 20:14:27
12 [报告]
发表于 2008-05-31 23:40 |只看该作者
原帖由 tyc611 于 2008-5-31 23:00 发表

clear()只是删除元素,但不会回收空间,只有map对象被析构时才会回收空间,所以前面那个clear是多余的


我也这么认为

论坛徽章:
0
13 [报告]
发表于 2008-06-01 00:43 |只看该作者
>>>如何让 STL 确实释放内存
不要做内存监控或者考证,除非你是库实现评定的专家,关键先把STL用好。。

在《effective STL》和其实很多C++文章中都有指明,用clear()无法保证内存回收。但是swap技法可以。。
----
vector<int> nums;
nums.push_back(1);nums.push_back(1);nums.push_back(2);nums.push_back(2);
vector<int>().swap(nums); //或者nums.swap(vector<int>());
----

[ 本帖最后由 uppet 于 2008-6-1 00:45 编辑 ]

论坛徽章:
0
14 [报告]
发表于 2008-06-01 10:02 |只看该作者
原帖由 uppet 于 2008-6-1 00:43 发表
>>>如何让 STL 确实释放内存
不要做内存监控或者考证,除非你是库实现评定的专家,关键先把STL用好。。

在《effective STL》和其实很多C++文章中都有指明,用clear()无法保证内存回收。但是swap技法可以。。 ...

这就是我要解决的问题: 怎么把 STL 用好. 据我现在查到的资料, 这种表现的原因是 HP STL 的的内存分配器使用了内存池技术, 该内存池只能变大, 但不能自动变小. 如果真是这样, 如何手工让内存池变小.

论坛徽章:
0
15 [报告]
发表于 2008-06-01 10:53 |只看该作者
原帖由 ideawu 于 2008-5-31 23:28 发表

我在Windows XP下, 用系统自带的监视器查看. 如果用 VC6 来编译上面的程序, 可以观察到 delete m 后, 系统内存占用明显下降. 用 cygwin 环境时, 是贴子中的情况.


VC6的STL直接用了operator new / operator delete,所以能看到内存的变化。而Cygwin中的GCC用的应该是HP STL或从它继承来的SGI STL,对于小内存有一种缓冲池机制,一旦进池的内存就再也不会交还给系统了(反正我原来看到的实现是这样的,最新版本不知道)。

论坛徽章:
0
16 [报告]
发表于 2008-06-01 11:48 |只看该作者
原帖由 Cyberman.Wu 于 2008-6-1 10:53 发表


VC6的STL直接用了operator new / operator delete,所以能看到内存的变化。而Cygwin中的GCC用的应该是HP STL或从它继承来的SGI STL,对于小内存有一种缓冲池机制,一旦进池的内存就再也不会交还给系统了(反 ...

谢谢回复. 我的程序中, STL 使用的内存超过 100M, 也是这种表现. 100M可不小了. "一旦进池的内存就再也不会交还给系统了", 如果真是这样, 这个 STL 的实现看来是不适合我的应用. 因为我的程序要长时间(如一个月)运行, 绝对不能让 STL 的内存池占着内存. 能不能帮忙推荐其它的 STL 实现.

[ 本帖最后由 ideawu 于 2008-6-1 11:51 编辑 ]

论坛徽章:
0
17 [报告]
发表于 2008-06-01 15:44 |只看该作者
原帖由 ideawu 于 2008-6-1 11:48 发表

谢谢回复. 我的程序中, STL 使用的内存超过 100M, 也是这种表现. 100M可不小了. "一旦进池的内存就再也不会交还给系统了", 如果真是这样, 这个 STL 的实现看来是不适合我的应用. 因为我的程序要长时间(如一个 ...



区区一直用mingw的STL,没觉得内存会一直占着。阁下可以用下面的程序来试试:
#include<iostream>
#include<deque>
using namespace std;

void eat_memory(){
&nbsp;&nbsp;&nbsp;&nbsp;deque<int> dummy_num;
&nbsp;&nbsp;&nbsp;&nbsp;for(int i=0; i< 1000 * 1000 * 100; ++i) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dummy_num.push_back(i);
&nbsp;&nbsp;&nbsp;&nbsp;}
};

int main()
{
&nbsp;&nbsp;&nbsp;&nbsp;eat_memory();
&nbsp;&nbsp;&nbsp;&nbsp;eat_memory(); //again

&nbsp;&nbsp;&nbsp;&nbsp;eat_memory(); //again

&nbsp;&nbsp;&nbsp;&nbsp;eat_memory(); //and again

&nbsp;&nbsp;&nbsp;&nbsp;cin.get(); //wait for taskmgr

&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}


补充说明一下,用vector一下子很难从系统中要到连续的100MB,所以区区用的是deque。
在cin.get()时,你可以查看一下内存状况(过程中查看也很有意思~)。
mingw使用的allocator是include/c++/3.4.5/mingw32/bits/c++allocator.h
最终会指向include/c++/3.4.5/ext/new_allocator.h
GCC的new_allocator实现如下:
      pointer
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;allocate(size_type __n, const void* = 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ return static_cast<_Tp*>(::operator new(__n * sizeof(_Tp))); }


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;deallocate(pointer __p, size_type)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ ::operator delete(__p); }

所以用new_allocator的话内存是不会长期占用的。

论坛徽章:
0
18 [报告]
发表于 2008-06-01 18:25 |只看该作者
swap

论坛徽章:
0
19 [报告]
发表于 2008-06-01 19:54 |只看该作者
原帖由 tyz 于 2008-6-1 18:25 发表
swap

swap 不起作用, 因为原因是 allocator.

论坛徽章:
0
20 [报告]
发表于 2008-06-01 20:04 |只看该作者
原帖由 uppet 于 2008-6-1 15:44 发表



区区一直用mingw的STL,没觉得内存会一直占着。阁下可以用下面的程序来试试:

我就用你的程序试了, 一样效果.

不过, 我改成 vector 后, 内存确实返回给操作系统了. 我的 gcc 是 3.4.4 版本, 我升级后再试试.

[ 本帖最后由 ideawu 于 2008-6-1 20:10 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP