与this question类似,但是使用对象而不是指针。
如果我有以下代码
Foo f;
vector<Foo> vect;
vect.push_back(f);
vect.erase(vect.begin());
我的对象去哪儿了?删除是否被调用?如果其他人持有指向它的指针怎么办?这是内存泄漏吗?
答案 0 :(得分:8)
push_back
在向量中存储f
的副本,erase
会将其销毁。 f
本身不受此影响。
向量erase
时,向量中元素的所有指针,引用和迭代器都将失效。在erase
之后使用它们来访问元素会产生未定义的行为。
答案 1 :(得分:3)
在您的情况下,vector
包含f
的副本,而不是指针。在erase
,它只会破坏该副本。
答案 2 :(得分:2)
迭代器擦除(迭代器位置);
迭代器擦除(首先是迭代器,最后是迭代器);
这有效地减少了向量 大小由元素数量决定 删除,调用每个元素 析构函数之前。
因为向量保持数组格式, 擦除除了以外的位置 矢量结束也移动所有元素 片段删除后,他们新的 职位,这可能不是一种方法 与其他类型的擦除一样有效 序列容器(deque,list)。
这会使所有迭代器和 在位置之后引用元素 或者首先。
在这种情况下,你仍然拥有你的对象f,因为你在将它(通过推回)复制到向量之前声明了它。
当从向量中删除时,在复制的对象上调用析构函数,并且向量的迭代器被破坏。
答案 3 :(得分:0)
是的,erase会为向量中的对象调用析构函数。
当对象插入到向量中时,它的复制构造函数被调用并且它的副本被放入向量中,所以如果你有一个指向f
的指针(并且没有{{1的副本)为向量创建),您不必担心从向量中删除对象的后果。
答案 4 :(得分:0)
推回元素时,会复制一份。 擦除后,副本被销毁,但f仍然有效。 如果复制的元素上有一个指针,它将成为一个悬空引用,这意味着指针指向的内容无效。 如果在复制的元素上使用迭代器,它也将变为无效