STL容器如何销毁对象

5
在STL中,当调用std::vector::erase或std::vector::pop_back时,它是如何调用对象的析构函数的呢?

您是指语义(例如,顺序),还是C ++语法用于实现其所述语义? - Pavel Minaev
2个回答

6
vector有一个与之关联的分配器destroy成员用于清理。

调用对象的析构函数而不释放存储对象的内存。

顺便说一句,如果你有一个不错的IDE,你可以跟踪源代码。


4
也许可以补充一下 Steve 给出的好答案:
确实,内部分配是由分配器来完成的,它们有两个独立的目的:分配和释放内存,以及构建和销毁对象。对象总是在插入时被复制或移动构造,并在擦除时被销毁,但内部会有所变化。
基于节点的容器通常会分配和构造一个完整的内部节点,其中包含实际对象和记录数据(例如双向链表中的下一个/上一个指针)。当您擦除其中之一时,容器将销毁对象并释放内存。
像 vector 这样的序列容器严格区分分配和构造;已分配的内存量通常只会增加,但是当您擦除元素(在已调用擦除对象的析构函数之后),其他元素必须被移动以维护连续的内存布局。
如果您之前没有见过内部分配工作,可能会觉得它与您平时使用的 new/delete 工作非常不同,但最终总会在某个地方进行构建和销毁。

哦,我想我明白了。就像这样吗?http://pastebin.com/yyCYCAZB只是在STL的情况下,这些函数是在一个类中实现的? - ConsciousCode
@PiMaster:是的,这些是分配器的典型工作函数(但要注意,真正的分配器类还必须满足大量额外的要求)。 - Kerrek SB
没有太多的要求,但有一个非常糟糕的要求是关于类型全局性而不是实例。我应该检查一下C++0x是否已经解决了这个问题。 - edA-qa mort-ora-y
@edA:你还需要定义大量的typedef和臭名昭著的“rebind”机制... - Kerrek SB
我再次查看了我的代码,嗯,我想它确实很多:7个typedef、1个愚蠢的重新绑定和11个函数。 - edA-qa mort-ora-y

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接