C++ 尝试在结构中存储数据时发生堆分配错误
问题 我想将几个立方体的位置、法线和颜色存储到一个结构中,并将它们应该绘制的索引存储在一个向量中。然而,我的方法在malloc.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 <
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!
}