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仍然有效。 如果复制元素上有一个指针,它将成为悬挂引用,这意味着指针指向的内容无效。 如果您正在使用复制的元素的迭代器,它也将成为无效
迭代器擦除(迭代器位置);
迭代器擦除(迭代器优先,迭代器最后);
这有效地通过元件 除去之前调用每个元素的析构函数 数,减小了矢量 大小。
因为载体保持的阵列格式, 擦除上比 矢量端部以外的位置也移动所有元素 后段擦除到它们的新 位置,这可能不是一个方法 作为擦除在高效序列容器(deque,list)的其他种类 。
这使所有迭代器和 对位置 或第一个之后的元素的引用无效。
在这种情况下,你仍然有你的对象楼因为你复制它(通过反推)到载体之前声明它。
当您从矢量中删除时,在复制的对象上调用析构函数,矢量的迭代器被破坏。