C++ 尝试在结构中存储数据时发生堆分配错误

C++ 尝试在结构中存储数据时发生堆分配错误,c++,opengl,C++,Opengl,问题 我想将几个立方体的位置、法线和颜色存储到一个结构中,并将它们应该绘制的索引存储在一个向量中。然而,我的方法在malloc.c中触发了一个错误 我在做什么 我从文件中加载立方体的位置以及立方体的颜色: vector<vec3> cp; // size 51 vector<vec3> cc; // size 51 readLevelFile("levelfile.txt", cp, cc); 然后迭代多维数据集位置的数量: for (int j = 0; j <

问题

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

我在做什么

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

vector<vec3> cp; // size 51
vector<vec3> cc; // size 51
readLevelFile("levelfile.txt", cp, cc);
然后迭代多维数据集位置的数量:

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()));
    }

}

这简化了将数据存储在缓冲区中的过程,可能是因为您只为立方体数据分配了一个顶点对象。循环中有大量内存覆盖

Vertex *cubeData = new Vertex;
只分配一个顶点的。如果不想分配数组,则必须使用新的[]运算符:

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()));
    }
}

我试着这样做,因为我稍后会调用一个函数,将数据加载到顶点缓冲区中。因此,我希望结构类似于顶点结构。@Attaque如果以后需要向量的底层数组,只需调用它的成员。啊,我明白了!我认为它现在可能正在工作,但是我对立方体的定位是错误的。我将尝试修复它,最终解决了错误的转换,这样我就可以确认你的答案解决了我的问题。谢谢你,Manu343726这就是向量的内容。正如我在评论/回答中所说,只需调用std::vector::data成员函数来检索底层数组。@Manu343726:std::vector没有数据。。。成员函数,除非您假设这是一个关于C++11的问题。我建议改为使用&vector[0],因为它更便于携带。谁否决了我的问题:要不要解释一下,这样我就不会再犯同样的错误?
Vertex *cubeData = new Vertex;
Vertex *cubeData = new Vertex[cp.size()*vertexPositions.size()*vertexPositions.size()];
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()));
    }
}
void f(Vertex* array_of_vertex);

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

    //....

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