我在删除矢量数据时遇到问题。
当我创建数据时,我首先在数组中保留空间,然后调整向量的大小并复制数组的地址:
//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
...
答案 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)
这里有两件事:
正如许多人所指出的,分配数组需要删除数组。但是,我认为它掩盖了你真正想要做的事情。更改您的分配,为每个项目执行“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;
}