无序映射是否在调用clear后释放其内存?

时间:2017-03-02 16:26:37

标签: c++11

我知道无序映射会在执行clear()时删除存储在其中的对象,但是它还会放弃它自己创建的内存(返回操作系统)。

struct A{
   A(){std::cout << "constructor called\n";}

   ~A(){std::cout << "destructor called\n";}
};

// this will reserve size of 1000 buckets
std::unordered_map<int, A> my_map{1000};
     // now insert into the map
     my_map[1] = "asdf";
     my_map[2] = "asdff";
     ....

然后我做my_map.clear();这将调用A的析构函数。

所以我的问题是,保留的1000个桶也将被释放吗?我在尝试清除它之后尝试查看size()零,所以是否有类似于vector的容量,类似于vector,可以让我查看保留的大小?

2 个答案:

答案 0 :(得分:2)

  

保留的1000个桶也将被释放吗?

标准没有规定。

  

是否有类似于vector的容量,类似于vector,可以让我查看保留的大小?

简单的容量&#34;值对哈希映射没有意义。当load_factor超过max_load_factor时发生重新发布。您可以使用bucket_count检查存储桶的数量。

答案 1 :(得分:1)

  

我知道无序映射会在执行clear()时删除存储在其中的对象,但是它还会放弃它自己创建的内存(返回操作系统)。

无法保证(特别是因为C ++ 11规范不知道操作系统是什么),实际上它通常不会将内存释放到操作系统(即你的{{3可能保持不变)。

会发生什么(virtual address spacestd::map template没有特定的Allocator参数)内存为delete - d(或delete[] - d)。如果您真的非常关心,请实施std::unordered_map template并将其正确传递给您的容器模板。我不确定这是值得的。

通常new拨打malloc&amp; delete来电free。在这种情况下,在大多数(但不是全部)情况下,内存不会释放到内核(例如,在Linux上使用own Allocator ...),但只是在未来调用new时标记为可重用。

详细信息当然是特定于实施的。例如,许多free(或delete)实现将munmap释放足够大的块(几兆字节或更多)。确切的阈值从一个实现到下一个实现不同。

请注意,如果您使用munmap(2)(例如,带有GCC的Linux系统,GNU libc,....),您可以查看C ++标准库的源代码({{1}的代码}和std::map等... free software}以及您的C标准库(代码::operator delete)并自行查找这些血腥的细节。