保留和删除向量?

时间:2011-05-16 18:04:08

标签: c++ memory-management vector

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

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

//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];
}

有人知道为什么会这样吗?

顺便说一句,由于一些实现细节,我不能在new TriVertex内创建for ...

6 个答案:

答案 0 :(得分:3)

使用

分配对象数组
TriVertex *vertsaux = new TriVertex[vn];

要再删除它,您需要执行

delete[] vertsaux;

您无法单独删除元素。

答案 1 :(得分:1)

你并没有给我们足够的信息。它是什么 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;
}

我没有看到中间动态的任何理由 分配数组。 (如果有,Joe的回答是正确的。)

答案 2 :(得分:0)

delete this->verts[i];

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

应使用delete[]语句删除此类数组,并删除整个数组

答案 3 :(得分:0)

由于您创建了由TriVertex指向的vertsaux数组,因此您应该使用以下命令删除数组:

delete[] vertsaux;

您无法删除数组的各个元素。

完成上述delete[]后,您应该删除verts的所有元素,如下所示:

verts.clear();

这是因为您删除了vertsaux后,verts内的指针无效。

我假设顶点类似于:std::vector<TriVertex*>

答案 4 :(得分:0)

使用

分配数组时
TriVertex *vertsaux = new TriVertex[vn];

您必须通过调用

使用delete[]解除分配
delete[] vertsaux;

答案 5 :(得分:0)

这里有两件事:

  1. 正如许多人所指出的,分配数组需要删除数组。但是,我认为它掩盖了你真正想要做的事情。更改您的分配,为每个项目执行“new TriVertex”。

  2. 假设你的向量存储了TriVertex*个指针,你确实必须删除析构函数中的每个项目(正如你所写的那样)。

  3. 因此,修复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;
    }