#include <vector>
#include <iostream>
#include <memory>
using namespace std;
class Test
{
public:
Test (){ cout<<"Const\n"; }
~Test (){ cout<<"Dest\n"; }
};
int main( )
{
vector<Test *> tVec;
tVec.push_back(new Test());
tVec.push_back(new Test());
tVec.insert(tVec.end(),new Test());
tVec.emplace(tVec.end(),new Test[4]);
vector<Test *>::iterator it;
for(it = tVec.begin(); it != tVec.end(); it++)
{
delete *it;
it = tVec.erase(it);
}
return 0;
}
输出:
常量 常量 常量 常量 常量 常量 常量 目的地 目的地
只调用了两个析构函数,而调用了8个构造函数。我知道我创建的最后四个对象是一个数组。是否有任何通用的方法来删除 vector 中的单个对象。第二如何访问这些单独的数组元素。
最佳答案
(正式地,您的程序的行为是未定义:您必须永远将 new[]
与 delete
混合:每个 new
必须与 delete
平衡,并且每个 new[]
与 delete[]
平衡.)
it = tVec.erase(it);
与 it++
循环中的 for
的交互为您提供 gyp。 (erase
返回的迭代器已经是下一个)。
您错过了所有其他 vector 元素。
从 for
循环(我的首选)中删除增量语句,一切都会好起来的。
至于通用方式,如果您改用 std::vector<std::unique_ptr<Test>>
,那么更简单、更可靠的 tVec.clear()
就可以完成这项工作。或者使用 std::vector<Test>
并使用 (i) 安置和 (ii) 信任您的编译器,以避免任何值复制。
关于c++ - 在 C++ 中删除 vector 的单个元素的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36499828/