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

hen*_*yao 3 c++ containers destructor stl

ClassA{
public:
std::map<int,int> m_map;
...
...
};
Run Code Online (Sandbox Code Playgroud)

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

1> 0 | ?$map@HHU?$less@H@std@@V?$allocator@U?$pair@$$CBHH@std@@@2@ m_map
1>28 | ......
Run Code Online (Sandbox Code Playgroud)

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

Lig*_*ica 8

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

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

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


Law*_*llo 5

回答你的问题:

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

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

我认为不要太担心这一点是明智的.API旨在减轻您提到的担忧.