我在保留数组时遇到问题。问题是堆错误。我正在制作的软件是这样的:
我正在制作一个小软件来渲染特定格式的模型。该模型包含几个组,每个组包含数组顶点和这些顶点的索引数组“,例如3组摩托车模型:前轮,后轮和车身。我将模型加载到内存后,我想将其渲染为一个vbo,但是模型由上面提到的几个组组成。所以我将所有组中的所有顶点合并为一个顶点数组,并且同样适用于索引。当保留数组时合并堆错误。代码就像这样:
int index=0;
for(int i=0;i<this->groupsSize;i++)
index+=this->groups[i]->capacity.vertsSize;
mdl_vert *m_pVertices=new mdl_vert[index];
index=0;
for(int i=0;i<this->groupsSize;i++)
index+=this->groups[i]->capacity.indicesSize;
unsigned int *m_pIndices=new unsigned int[index];
index=0;
for(int i=0;i<this->groupsSize;i++)
{
for(int j=0;j<this->groups[i]->capacity.vertsSize;j++)
{
m_pVertices[index]=this->groups[i]->verts[j];
index++;
}
}
当我保留索引时,堆错误正在发生。我也使用了std :: vector但是发生了同样的错误。在这种情况下,任何人都能给我一些我在做错的提示吗?
N.B。 mdl_vert是一个由float x,y,z组成的结构;在保留数组时引起。
答案 0 :(得分:2)
您没有提供足够的信息来查明问题,甚至是问题所在。
但是有些事情可以用来清理代码,也许这会有所帮助。
而不是
unsigned int *m_pIndices=new unsigned int[index];
使用
std::vector<unsigned> indices( index );
请注意,此std::vector
本身并非动态分配。
它在内部使用动态分配,并且它正确地为您完成。
更好的是,只需使用......
std::vector<int> indices( index );
...因为无符号算术很容易搞砸。
m_
前缀使您看起来好像想要访问数据成员,而不是本地变量。
但是你要定义局部变量。
使用数据成员,或删除m_
名称前缀。
您正在将变量index
用于多个连续目的。
为每个目的声明并使用一个(正确命名的)变量。
例如,您在index
- 循环之后依赖for
的值,它使用循环计数器。
相反,请直接使用您推导出的值。
这只是一个样式问题,但请考虑删除所有this->
资格。它冗长而且模糊了代码;它使代码可读性降低,不太清晰。是的,使用像Visual Studio这样的原始工具,这些资格可以帮助在下拉列表中获取名称,但这是一种伤害:它使记忆事情变得更加困难,并且在不记住事情的情况下,您无法理解编写正确的内容代码。
干杯&amp;第h。,
答案 1 :(得分:1)
结果索引有多大?可能只是发生溢出。
答案 2 :(得分:1)
你知道错误是什么吗?如果没有,您可能想尝试将代码放入带有std :: exception的try / catch中。通常当我在这些行中出现错误时,它与st9bad_alloc错误有关。这实际上意味着提供给新的大小无效或太大(无论是在术语还是实际内存中,或者由于系统对堆栈空间施加的限制)。如果是这样,请验证提供给new的数字,并确保堆栈大小足够大(如果使用Linux,请尝试'limit'命令)。祝你好运
答案 3 :(得分:0)
您的一个或多个capacity.indicesSize可能未初始化,因此您获得的数字太大了。分配前打印索引