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

问题描述:

this question类似,但使用对象而不是指针。myVector.erase(myObject)是否在myObject上调用delete?

如果我有下面的代码

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

哪里我的对象去了?删除调用它吗?如果别人持有一个指针呢?这是内存泄漏吗?

push_back在载体中存储拷贝f,并且erase销毁它。 f本身并不受此影响。

当你在一个向量中的一个元素的所有指针,引用和迭代器都是无效的,当你erase它。使用它们访问erase之后的元素将产生未定义的行为。

在你的情况下,vector持有f的副本,而不是指针。在erase它只会摧毁该副本。

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

当对象被插入载体,它的拷贝构造函数被调用,它的副本放置到载体,所以如果你有在f一个指针指向(并为载体创建的f没有副本) ,您不必担心从矢量中删除对象的后果。

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

cplusplus.com

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

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

这有效地通过元件 除去之前调用每个元素的析构函数 数,减小了矢量 大小。

因为载体保持的阵列格式, 擦除上比 矢量端部以外的位置也移动所有元素 后段擦除到它们的新 位置,这可能不是一个方法 作为擦除在高效序列容器(deque,list)的其他种类 。

这使所有迭代器和 对位置 或第一个之后的元素的引用无效。

在这种情况下,你仍然有你的对象楼因为你复制它(通过反推)到载体之前声明它。

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