如果类在VC编译器中包含容器(如std :: map),那么它的内存布局是什么

时间:2015-07-24 19:33:32

标签: c++ stl containers destructor

ClassA{
public:
std::map<int,int> m_map;
...
...
};

我在visual studio中尝试了/d1reportSingleClassLayout,但无法真正解码输出:

1> 0 | ?$map@HHU?$less@H@std@@V?$allocator@U?$pair@$$CBHH@std@@@2@ m_map
1>28 | ......

我的理解是容器的大小不固定,所以在ClassA的Obj的内存布局中,应该存在一个指向堆中实际m_map内容的指针?

2 个答案:

答案 0 :(得分:8)

std::map实施的精确布局取决于编写标准库的人员。它不是由C ++定义的。

您可以调查构建计算机上的标准标头,或者您可以简单地忘记它并代之以标准API。

但是,是的,某处会有一个或两个指针,指向动态分配的内存。可能相当多。

答案 1 :(得分:5)

回答你的问题:

  1. 是否会有一个指向堆中m_map的指针?这只是std::map的制造商可以回答的问题。我会说是的,但是你必须先看看map的实现才能最终找到它。为了使地图动态增长,必须有一个指针。

  2. A类的默认析构函数会自动释放分配给m_map的空间吗?是的,它们的设计考虑到了这一点,因此程序员不必担心内存。但是,它执行此操作的方法也在std::map

  3. 的实现中

    我认为不要太担心这件事是明智的。该API旨在减轻您提到的担忧。