保留和删除矢量

Reserving and deleting vectors?

本文关键字:删除 保留      更新时间:2023-10-16

我在删除向量的数据时遇到问题。

当我创建数据时,我首先在数组中保留空间,然后调整向量的大小并复制数组的地址:

//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();

这是因为由于您已经删除了vertsauxverts内的指针无效。

我假设 verts 是这样的:std::vector<TriVertex*>

delete this->verts[i];

这会删除您创建的动态分配数组中的一个项目,并且实际上是 UB 以这种方式删除它。

这样的数组应该用delete[]语句删除,这会删除整个数组

这里有

两件事:

  1. 正如许多人指出的那样,分配数组需要作为数组删除。 但是,我认为这掩盖了您在这里真正想做的事情。 更改您的分配以对每个项目执行"new TriVertex"。

  2. 假设你的向量存储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;
}