c ++变量数组预留问题

时间:2011-02-21 01:28:43

标签: c++ arrays variables

我在保留数组时遇到问题。问题是堆错误。我正在制作的软件是这样的:

我正在制作一个小软件来渲染特定格式的模型。该模型包含几个组,每个组包含数组顶点和这些顶点的索引数组“,例如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组成的结构;在保留数组时引起。

4 个答案:

答案 0 :(得分:2)

您没有提供足够的信息来查明问题,甚至是问题所在。

但是有些事情可以用来清理代码,也许这会有所帮助。


1.使用std :: vector代替`new`-ing raw arrays

而不是

unsigned int *m_pIndices=new unsigned int[index];

使用

std::vector<unsigned> indices( index );

请注意,此std::vector本身并非动态分配。

它在内部使用动态分配,并且它正确地为您完成。

更好的是,只需使用......

std::vector<int> indices( index );

...因为无符号算术很容易搞砸。

2.不要使用误导性命名

m_前缀使您看起来好像想要访问数据成员,而不是本地变量。

但是你要定义局部变量。

使用数据成员,或删除m_名称前缀。

3.不要“重用”变量

您正在将变量index用于多个连续目的。

为每个目的声明并使用一个(正确命名的)变量。

4.不要依赖早期代码的副作用。

例如,您在index - 循环之后依赖for的值,它使用循环计数器。

相反,请直接使用您推导出的值。

5.不要使用无操作的东西来掩盖代码。

这只是一个样式问题,但请考虑删除所有this->资格。它冗长而且模糊了代码;它使代码可读性降低,不太清晰。是的,使用像Visual Studio这样的原始工具,这些资格可以帮助在下拉列表中获取名称,但这是一种伤害:它使记忆事情变得更加困难,并且在不记住事情的情况下,您无法理解编写正确的内容代码。


干杯&amp;第h。,

答案 1 :(得分:1)

结果索引有多大?可能只是发生溢出。

答案 2 :(得分:1)

你知道错误是什么吗?如果没有,您可能想尝试将代码放入带有std :: exception的try / catch中。通常当我在这些行中出现错误时,它与st9bad_alloc错误有关。这实际上意味着提供给新的大小无效或太大(无论是在术语还是实际内存中,或者由于系统对堆栈空间施加的限制)。如果是这样,请验证提供给new的数字,并确保堆栈大小足够大(如果使用Linux,请尝试'limit'命令)。祝你好运

答案 3 :(得分:0)

您的一个或多个capacity.indicesSize可能未初始化,因此您获得的数字太大了。分配前打印索引