我知道无序映射会在执行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,可以让我查看保留的大小?
答案 0 :(得分:2)
保留的1000个桶也将被释放吗?
标准没有规定。
是否有类似于vector的容量,类似于vector,可以让我查看保留的大小?
简单的容量&#34;值对哈希映射没有意义。当load_factor
超过max_load_factor
时发生重新发布。您可以使用bucket_count
检查存储桶的数量。
答案 1 :(得分:1)
我知道无序映射会在执行clear()时删除存储在其中的对象,但是它还会放弃它自己创建的内存(返回操作系统)。
无法保证(特别是因为C ++ 11规范不知道操作系统是什么),实际上它通常不会将内存释放到操作系统(即你的{{3可能保持不变)。
会发生什么(virtual address space或std::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
)并自行查找这些血腥的细节。