myVector.erase(myObject)是否在myObject上调用delete?

时间:2010-07-20 14:06:17

标签: c++ pointers containers

this question类似,但是使用对象而不是指针。

如果我有以下代码

Foo f;
vector<Foo> vect;
vect.push_back(f);
vect.erase(vect.begin());

我的对象去哪儿了?删除是否被调用?如果其他人持有指向它的指针怎么办?这是内存泄漏吗?

5 个答案:

答案 0 :(得分:8)

push_back在向量中存储f副本erase会将其销毁。 f本身不受此影响。

向量erase时,向量中元素的所有指针,引用和迭代器都将失效。在erase之后使用它们来访问元素会产生未定义的行为。

答案 1 :(得分:3)

在您的情况下,vector包含f的副本,而不是指针。在erase,它只会破坏该副本。

答案 2 :(得分:2)

来自cplusplus.com

  

迭代器擦除(迭代器位置);

     

迭代器擦除(首先是迭代器,最后是迭代器);

     

这有效地减少了向量   大小由元素数量决定   删除,调用每个元素   析构函数之前。

     

因为向量保持数组格式,   擦除除了以外的位置   矢量结束也移动所有元素   片段删除后,他们新的   职位,这可能不是一种方法   与其他类型的擦除一样有效   序列容器(deque,list)。

     

这会使所有迭代器和   在位置之后引用元素   或者首先。

在这种情况下,你仍然拥有你的对象f,因为你在将它(通过推回)复制到向量之前声明了它。

当从向量中删除时,在复制的对象上调用析构函数,并且向量的迭代器被破坏。

答案 3 :(得分:0)

是的,erase会为向量中的对象调用析构函数。

当对象插入到向量中时,它的复制构造函数被调用并且它的副本被放入向量中,所以如果你有一个指向f的指针(并且没有{{1的副本)为向量创建),您不必担心从向量中删除对象的后果。

答案 4 :(得分:0)

推回元素时,会复制一份。 擦除后,副本被销毁,但f仍然有效。 如果复制的元素上有一个指针,它将成为一个悬空引用,这意味着指针指向的内容无效。 如果在复制的元素上使用迭代器,它也将变为无效