保留和删除矢量
Reserving and deleting vectors?
我在删除向量的数据时遇到问题。
当我创建数据时,我首先在数组中保留空间,然后调整向量的大小并复制数组的地址:
//Create the vertices
verts.reserve(vn); verts.resize(vn);
TriVertex *vertsaux = new TriVertex[vn];
for(int i=0, c=0; i<vn; i++, c+=3)
{
vertsaux[i].SetId(i);
vertsaux[i].SetCoords0(Vector3(vs[c], vs[c+1], vs[c+2]));
//Inicializate texture vertices
vertsaux[i].SetTextureCoords(Vector2(0.0f, 0.0f));
}
for(int i=0; i<vn; i++)
{
verts[i] = &vertsaux[i];
}
但是在我的类的析构函数中,当我这样做时,它会给我一个运行时错误:
for (i=0; i < this->verts.size(); i++) {
delete this->verts[i];
}
有人知道为什么会发生这种情况吗?
顺便说一句,我不能只在for
中创建new TriVertex
,因为一些实现细节......
使用 分配对象数组
TriVertex *vertsaux = new TriVertex[vn];
要再次删除它,您需要做
delete[] vertsaux;
您不能单独删除元素。
你没有给我们足够的信息。 它是什么verts
类型 ? 你为什么要用versaux
? 从什么我能看到的很少,最合乎逻辑的解决方案是拥有 std::vector <TriVertex> verts;
为班级成员,并且直接初始化它,无需中间动态分配。 或:
verts.reserve(vn);
for ( int i = 0; i < vn; ++ i ) {
verts.push_back( TriVertex() );
TriVertex& current = verts.back();
current.SetId( i );
current.SetCoords( Vector3( *vs, *(vs+1), *(vs+ 2) ) );
current.SetTextureCoords( Vector2( 0.0, 0.0 ) );
vs += 3;
}
我看不出任何中间,动态的理由分配的数组。 (如果有的话,乔的回答是正确的。
使用 分配数组时
TriVertex *vertsaux = new TriVertex[vn];
您必须通过调用来使用 delete[]
来解除分配
delete[] vertsaux;
由于您创建了一个由 vertsaux
指向的 TriVertex
数组,因此您应该使用以下方法删除该数组:
delete[] vertsaux;
您无法删除数组的各个元素。
完成上述delete[]
后,您应该像这样删除verts
的所有元素:
verts.clear();
这是因为由于您已经删除了vertsaux
,verts
内的指针无效。
我假设 verts 是这样的:std::vector<TriVertex*>
delete this->verts[i];
这会删除您创建的动态分配数组中的一个项目,并且实际上是 UB 以这种方式删除它。
这样的数组应该用delete[]
语句删除,这会删除整个数组。
两件事:
正如许多人指出的那样,分配数组需要作为数组删除。 但是,我认为这掩盖了您在这里真正想做的事情。 更改您的分配以对每个项目执行"
new TriVertex
"。假设你的向量存储
TriVertex*
指针,你确实必须删除析构函数中的每个项目(正如你所写的)。
因此,修复TriVertex
对象的初始分配策略应该可以解决问题。
for(int i=0, c=0; i<vn; i++, c+=3)
{
TriVertex *vertsaux = new TriVertex;
vertsaux->SetId(i);
vertsaux->SetCoords0(Vector3(vs[c], vs[c+1], vs[c+2]));
//Initializing texture vertices
vertsaux->SetTextureCoords(Vector2(0.0f, 0.0f));
verts[i] = vertsaux;
}
- C++ 删除存在于另一个矢量中的矢量项,同时保留顺序
- 从浮点数中删除小数部分但保留类型的有效方法
- 如果引用应该保留,不删除析构函数中的指针会导致内存泄漏吗?
- 删除数字并在C++中保留字符串的下划线
- 从QStringList中删除子目录,仅保留父母的目录
- 如何在保留弃用警告的同时删除类
- 保留动态分配的数组而不为删除而烦恼的最佳方法
- 删除动态数组,但保留指针
- 保留 std::vector 的前 N 个元素<>并删除其余元素
- 为什么迭代器指向的数据在从列表中删除后保留
- 有没有一种方便的方法可以从属性树中删除节点,同时保留其子节点
- 如何在列表中删除重复项并只保留唯一指针
- 从矢量中删除一对并为矢量对保留空间
- 从 C++ 代码中删除注释,同时保留行号
- STL矢量:当矢量容量因插入而增加时,在分配新的连续内存后,是否删除或保留旧的连续内存
- 删除左值,保留左值引用(标准类型特征可用?)
- 删除第一次循环时未调用析构函数的保留字
- 如何在c++中删除一对重复出现的列表?(保留只出现一次的元素)
- 将数组大小调整为较小的大小,保留相同的名称,删除数组中旧的位置
- 保留和删除矢量