stl如何调用对象的析构函数,如std :: vector :: erase或std :: vector :: pop_back?
答案 0 :(得分:6)
答案 1 :(得分:4)
对史蒂夫的好回答可能还有一些补充:
实际上,内部分配是由分配器完成的,分配器有两个不同的目的:分配和释放内存,构建和销毁对象。对象始终(复制或移动)在insert
上构建并在erase
上销毁,但内部变化。
基于节点的容器通常会分配和构建一个完整的内部节点,它包含实际的对象和簿记数据(比如下一个/上一个指针) - 链接列表)。当你擦除其中一个时,容器会破坏对象并释放内存。
像vector这样的序列容器将严格分开分配和构造;已分配的内存量通常只会增长,但是当您擦除时(在被调用的对象的析构函数被调用之后),必须移动其他元素以维持连续的内存布局。
如果您之前没有看到内部分配器工作,那么它可能看起来与您通常的new/delete
工作完全不同,但最终总会出现构造和破坏。