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内容的指针?
答案 0 :(得分:8)
std::map
实施的精确布局取决于编写标准库的人员。它不是由C ++定义的。
您可以调查构建计算机上的标准标头,或者您可以简单地忘记它并代之以标准API。
但是,是的,某处会有一个或两个指针,指向动态分配的内存。可能相当多。
答案 1 :(得分:5)
回答你的问题:
是否会有一个指向堆中m_map的指针?这只是std::map
的制造商可以回答的问题。我会说是的,但是你必须先看看map
的实现才能最终找到它。为了使地图动态增长,必须有一个指针。
A类的默认析构函数会自动释放分配给m_map的空间吗?是的,它们的设计考虑到了这一点,因此程序员不必担心内存。但是,它执行此操作的方法也在std::map
。
我认为不要太担心这件事是明智的。该API旨在减轻您提到的担忧。