【问题标题】:Does SGI STL default allocator has memory leak?SGI STL 默认分配器有内存泄漏吗?
【发布时间】:2018-02-22 22:35:22
【问题描述】:

__default_alloc_template 的两个静态成员已被用于管理其内存池:

static char* _S_start_free;
static _Obj* __STL_VOLATILE _S_free_list[_NFREELISTS];

来自操作系统的分配器查询堆空间如下:

_S_start_free = (char*)malloc(__n);

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

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

free(_S_start_free);

我很困惑。

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

帮帮我。

【问题讨论】:

  • 如果它要在程序的生命周期内生存,它可能不需要清理自己
  • 在现代操作系统上,程序在虚拟内存中运行。当程序结束时,内存映射就消失了。

标签: c++ memory-management stl


【解决方案1】:

第一个问题的答案是否定的!
SGI STL 的默认分配器 __default_alloc_template 在下面的 deallocate 函数中释放其内存:

 /* __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) malloc 函数释放目标块,将它们返回给操作系统。否则,对于那些小块,函​​数不会将内存归还,而是将它们放回内存池。

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

【讨论】:

  • 您能详细说明一下吗?这看起来像是用于释放分配给它的对象,而不是用于清理其内部结构。
  • 像 Vector 这样的容器已经并且确实负责释放由 _S_free_list 链接的内存。至于内存池,会在程序退出时收回。通常,在单线程进程的环境中,内存池被限制在一个很小的空间内。这就是记忆池的意义,做最后一个站着的人。
  • 感谢您的回答。对不起,我在上面的模棱两可的描述。但我关心的是,内存池的尽头在哪里。
  • 程序结束时。对不起,我的答案开头的错误,我应该是指SGI STL默认分配器是否有内存泄漏的答案?是没有。
猜你喜欢
  • 1970-01-01
  • 2016-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-03
  • 1970-01-01
  • 2015-01-15
相关资源
最近更新 更多