SGI STL中Alloc的问题

sogald_2001 2002-11-29 08:49:16
__default_alloc_template类中,我只看到内存的申请而从未看到释放。
请问这是为什么?
...全文
32 5 打赏 收藏 转发到动态 举报
写回复
用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说的:)

24,855

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧