社区
工具平台和程序库
帖子详情
SGI STL中Alloc的问题
sogald_2001
2002-11-29 08:49:16
__default_alloc_template类中,我只看到内存的申请而从未看到释放。
请问这是为什么?
...全文
37
5
打赏
收藏
SGI STL中Alloc的问题
__default_alloc_template类中,我只看到内存的申请而从未看到释放。 请问这是为什么?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
sogald_2001
2002-12-01
打赏
举报
回复
我也看到了。
还是觉得不爽,如果申请的内存过大,而且一段时间后使用完了,只靠OS的话,要等程序结束,那么其它程序就没法用这些内存,配置器完全是“占着茅坑不拉屎”啦:)
而且,好象不是所有的OS都能完全回收这些内存的吧? WIN2K是可以。98好象没这么优秀吧?:)
huxw
2002-12-01
打赏
举报
回复
不直接把内存还给系统,是很一般的做法。
所有操作系统,在进程退出的时候都能够清理进程中未归还的内存。无论win9x, win2k/xp, *nix....
北极猩猩
2002-12-01
打赏
举报
回复
allocator使用的是placement new来创建对象,placement new会在给定的内存处构造一个新的对象。
allocator会首先分配一大块内存,然后将它化成不同大小的区域——再SGI STL中有8、16、24、32……128共16种类型的块。在得到内存申请时,先根据申请的找到合适的块的大小(大于申请大小的最小8的倍数),然后在对应着一块大小的free list中,找到一开内存,将这块内存分配给程序,在这块内存中调用placement new来构造对象。
在释放内存时,只需简单的将内存块放回对应的free list中。
注意,我们所说的全部动作都是在一块已经实现分配好的内存(memory pool)中进行的,所以一切的内存都在allocator的掌控之下,最后只需要对最开始分配的内存free一下,就什么都解决了,并不存在什么内存泄漏(memory leak)的问题。
在你的程序不再使用memory pool中的一块内存时,它可以被memory pool用来提供给其他对象使用,内存不会耗尽的。
这样做的主要好处是可以提高内存的利用率。因为,在使用new分配内存时,会再分配的内存区前加入一个描述内存块大小的区域(cookie)通常为4个byte,而如果你需要的内存只有8个字节岂不是很浪费,而且如果你要分配1000000个这样的对象,那浪费就更是惊人!而memory pool解决了额外开销的问题。不只是在SGI STL中,Aparch等很多经常分配大量小额内存的软件都使用了memory pool的思想。
alula
2002-12-01
打赏
举报
回复
是咯,今天也发现这个问题,总觉得是一个问题。
还有一个问题,一级配置器__malloc_alloc_template调用 free 释放一个 void*,
free(*p);
有问题吗?
earthharp
2002-11-30
打赏
举报
回复
因为modern os会回收这一部分
hou sir说的:)
SGI
STL
.zip_
sgi
stl
_
sgi
stl
_
sgi
stl
hash_m_
sgi
stl
windows
SGI
STL
是由
SGI
公司开发的
STL
库.这份
STL
可以用在VC上.
SGI
STL
vector相关源码
SGI
vector源码
SGI
STL
源代码
SGI
的
STL
源码,配合《
STL
源码剖析》学习效果好,官网已经不再提供下载
SGI
_
STL
源码(附带个人详细)
这一版的
STL
比较贴近《
STL
源码解析》
中
的源码,可以配合使用
SGI
_
STL
.zip
侯捷
中
文注释
STL
源码,配合
STL
源码剖析看,建立读者对于
STL
巨观架构和微观技术的掌握,以及源代码的阅.读能力
工具平台和程序库
24,860
社区成员
27,333
社区内容
发帖
与我相关
我的任务
工具平台和程序库
C/C++ 工具平台和程序库
复制链接
扫一扫
分享
社区描述
C/C++ 工具平台和程序库
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章