首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SGI默认分配器是否存在内存泄漏?

SGI默认分配器是否存在内存泄漏?
EN

Stack Overflow用户
提问于 2017-09-14 04:43:51
回答 1查看 94关注 0票数 0

__default_alloc_template的两个静态成员被用来管理它的内存池:

代码语言:javascript
复制
static char* _S_start_free;
static _Obj* __STL_VOLATILE _S_free_list[_NFREELISTS];

来自操作系统的分配程序查询堆空间如下所示:

代码语言:javascript
复制
_S_start_free = (char*)malloc(__n);

然后,它使用堆的一部分构建一个名为_S_free_list的空闲内存列表。

但是,我找不到任何可以将内存还给操作系统的代码,例如:

代码语言:javascript
复制
free(_S_start_free);

我很困惑。

  • 这取决于系统的清洁吗?
  • 或者其他地方有清洁代码?

帮帮我。

EN

回答 1

Stack Overflow用户

发布于 2017-09-15 00:45:31

第一个问题的答案是否定的!

SGI的默认分配器__default_alloc_template在其释放函数中释放内存如下:

代码语言:javascript
复制
 /* __p may not be 0 */
static void deallocate(void* __p, size_t __n) {
    if (__n > (size_t) _MAX_BYTES)
        malloc_alloc::deallocate(__p, __n);
    else {
        _Obj* __STL_VOLATILE*  __my_free_list
            = _S_free_list + _S_freelist_index(__n);
        _Obj* __q = (_Obj*)__p;

        // acquire lock
#       ifndef _NOTHREADS
        /*REFERENCED*/
        _Lock __lock_instance;
#       endif /* _NOTHREADS */
        __q -> _M_free_list_link = *__my_free_list;
        *__my_free_list = __q;
        // lock is released here
    }
}

当需要释放的内存块大到_MAX_BYTES(128个字节,“大块”)时,函数将调用malloc_alloc::deallocate(__p,__n),后者只调用c malloc函数来释放目标块,并将它们返回到OS。否则,函数将不会将内存还给那些小块,而是将它们返回到内存池中。

这背后的理念是尽可能减少内存碎片,因为频繁地请求和释放空间将导致大量的内存碎片。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46210689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档