Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;可变数组保留问题_C++_Arrays_Variables - Fatal编程技术网

C++ c++;可变数组保留问题

C++ c++;可变数组保留问题,c++,arrays,variables,C++,Arrays,Variables,我在保留阵列时遇到问题。问题是堆错误。我正在制作的软件如下所示: 我正在制作一个小软件来渲染一个特定格式的模型。该模型包含多个组,每个组包含这些顶点的数组顶点和索引数组如摩托车模型有3组:前轮、后轮和车身。将模型加载到内存后,我希望将其渲染为vbo,但该模型由前面提到的几个组组成。因此,我将所有组中的所有顶点合并为一个顶点数组,索引也是如此。合并时,保留阵列时发生堆错误。代码如下所示: int index=0; for(int i=0;i<this->groupsSi

我在保留阵列时遇到问题。问题是堆错误。我正在制作的软件如下所示:

我正在制作一个小软件来渲染一个特定格式的模型。该模型包含多个组,每个组包含这些顶点的数组顶点和索引数组如摩托车模型有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++;
        }
    }
int索引=0;
对于(int i=0;igroupsSize;i++)
index+=此->组[i]->capacity.vertsize;
mdl_vert*m_pverties=新的mdl_vert[索引];
指数=0;
对于(int i=0;igroupsSize;i++)
索引+=此->组[i]->容量指示;
unsigned int*m_pIndices=新的unsigned int[index];
指数=0;
对于(int i=0;igroupsSize;i++)
{
对于(int j=0;jgroups[i]->capacity.vertsize;j++)
{
m_pverties[index]=this->groups[i]->verts[j];
索引++;
}
}
当我保留索引时,堆错误正在发生。我也使用了std::vector,但出现了相同的错误。有人能告诉我在这种情况下我做错了什么吗


注意:mdl_vert是一个由浮点x、y、z组成的结构;在保留数组时导致

您的一个或多个容量。IndicateSize可能未初始化,因此您得到的容量太大。在分配一个或多个容量之前打印索引。IndicateSize可能未初始化,因此您得到的数字太大。分配前打印索引结果索引有多大?可能只是发生了溢出。

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

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

你没有提供足够的信息来指出问题,甚至没有指出问题所在

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


1.使用std::vector而不是'new'-ing原始数组 而不是

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

…因为无符号算术很容易出错

2.不要使用误导性的命名
m
前缀使您看起来好像真的想访问数据成员,而不是本地变量

但您正在定义局部变量

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

3.不要“重用”变量 您将变量
索引
用于多个连续目的

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

4.不要依赖早期代码的副作用。 例如,在使用循环计数器的
For
-循环之后,依赖
index
的值

相反,直接使用您推断出的值

5.不要用“不做任何事情”来模糊代码。

这只是一个风格问题,但是考虑删除所有<代码> -> 资格。它的冗长和模糊的代码;这会降低代码的可读性和清晰度。是的,对于像VisualStudio这样的原始工具,这样的资格认证可以帮助您在下拉列表中获取名称,但这是一种伤害:它使您更难记住东西,如果不记住东西,您就无法理解编写正确代码所需的内容



干杯,

您没有提供足够的信息来指出问题,甚至没有指出问题所在

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


1.使用std::vector而不是'new'-ing原始数组 而不是

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

…因为无符号算术很容易出错

2.不要使用误导性的命名
m
前缀使您看起来好像真的想访问数据成员,而不是本地变量

但您正在定义局部变量

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

3.不要“重用”变量 您将变量
索引
用于多个连续目的

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

4.不要依赖早期代码的副作用。 例如,在使用循环计数器的
For
-循环之后,依赖
index
的值

相反,直接使用您推断出的值

5.不要用“不做任何事情”来模糊代码。

这只是一个风格问题,但是考虑删除所有<代码> -> 资格。它的冗长和模糊的代码;这会降低代码的可读性和清晰度。是的,对于像VisualStudio这样的原始工具,这样的资格认证有助于在下拉列表中获取姓名,但这是一种缺陷

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