尝试在struct中存储数据时堆分配错误

时间:2014-01-12 16:20:13

标签: c++ opengl

问题

我想将几个立方体的位置,法线和颜色存储到一个结构中,并将它们应该绘制的索引存储在一个向量中。但是我的方法在 malloc.c

中触发了错误

我在做什么

我从文件中加载立方体的位置以及立方体的颜色:

vector<vec3> cp; // size 51
vector<vec3> cc; // size 51
readLevelFile("levelfile.txt", cp, cc);

我使用对象加载器加载多维数据集的数据:

vector<vec3> vertexPositions; // size 24
vector<int> indices; // size 36
vector<int> outIndices; // empty
vector<vec3> normals; // size 24
vector<vec2> uvs; // unused
loadObject("cube_with_normals.obj", vertexPositions, indices, normals, uvs, 10.0f);
然后我创建一个新结构并创建一个实例:

struct Vertex {
    vec3 position;
    vec3 normal;
    vec3 color;
    vec2 texture;
};
Vertex *cubeData = new Vertex;

然后迭代多维数据集位置:

for (int j = 0; j < cp.size()*vertexPositions.size(); j+=vertexPositions.size()) {

    for (int i = 0; i < vertexPositions.size(); i++)
    {
        cubeData[j+i].position = vertexPositions[i]+cc[j/vertexPositions.size()];
        cubeData[j+i].normal = normals[i];
        cubeData[j+i].color = cc[j/vertexPositions.size()];

    }

    for (int i=0; i < indices.size();i++)
    {
        outIndices.push_back(indices[i]+indices.size()*(j/vertexPositions.size()));
    }

}

但是会在malloc.c中触发断点

修改 最终我希望数据看起来像这样:

Vertex groundData[] = {
    { vec3(-1000.0,ypos,1000.0),    vec3(0.0f, 1.0f, 0.0f), color, vec2(0.0f, 0.0f) },
    { vec3(-1000.0,ypos,-1000.0),   vec3(0.0f, 1.0f, 0.0f), color, vec2(0.0f, 1.0f) },
    { vec3(1000.0,ypos,-1000.0),    vec3(0.0f, 1.0f, 0.0f), color, vec2(1.0f, 1.0f) },
    { vec3(1000.0,ypos,1000.0),     vec3(0.0f, 1.0f, 0.0f), color, vec2(1.0f, 0.0f) }
};

这简化了将数据存储在缓冲区中的过程

2 个答案:

答案 0 :(得分:1)

Vertex *cubeData = new Vertex;

仅分配一个Vertex。如果您不想分配数组,则必须使用new[]运算符:

Vertex *cubeData = new Vertex[cp.size()*vertexPositions.size()*vertexPositions.size()];

但是,如果您知道如何使用std::vector自动管理其大小和内存,为什么要动态分配这些数据呢?

std::vector<Vertex> cubeData;

for (int j = 0; j < cp.size()*vertexPositions.size(); j+=vertexPositions.size()) {

    for (int i = 0; i < vertexPositions.size(); i++)
    {
        cubeData.emplace_back();

        cubeData[j+i] vertexPositions[i]+cc[j/vertexPositions.size()];
        cubeData[j+i].normal = normals[i];
        cubeData[j+i].color = cc[j/vertexPositions.size()];

    }

    for (int i=0; i < indices.size();i++)
    {
        outIndices.push_back(indices[i]+indices.size()*(j/vertexPositions.size()));
    }
}

如果你的函数需要数组而不是向量,那么没有问题,std::vector有一个成员函数data(),它返回一个指向底层数组的指针:

void f(Vertex* array_of_vertex);

int main()
{
    std::vector<Vertex> cubeData;

    //....

    f( cubeData.data() ); //Tah dah!
}

答案 1 :(得分:0)

可能是因为您只为Vertex分配了一个 cubeData对象。你的循环中有大量的内存覆盖。