C++ 真正释放STL中的内存时

C++ 真正释放STL中的内存时,c++,stl,C++,Stl,STL的分配器使用内存池技术,它只将需要释放的内存添加到空闲列表中,如下所示: 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_freelis

STL的分配器使用内存池技术,它只将需要释放的内存添加到空闲列表中,如下所示:

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;
        __q -> _M_free_list_link = *__my_free_list;
        *__my_free_list = __q;
    }
}

我想知道,什么时候真正释放空闲列表?

不能保证STL使用内存池(尽管它很常见)


它将取决于实现(编译器、库、版本、操作系统、机器体系结构、月球阶段)。一个常见的答案是,分配了新内存的内存只会在程序退出时返回到操作系统。

您使用的是哪种实现,以及“真正免费”是什么意思?这取决于:*取决于STL实现,*取决于操作系统,*取决于机器体系结构。我相信当内存块中没有使用过的内存时,它会返回内存块。因此,如果操作系统为您提供了一个4MB的页面,并且至少有一个字节在使用,它将不会被释放,因为您无法返回页面的一部分。实际上,分配了新的和小大小的内存通常只在程序退出时返回到操作系统。大容量分配的内存(这些术语的意思相当依赖于平台)在删除时返回。是的,这是另一种常见的方法。