C++ C++;:向量大小错误,并且大于元素数
在尝试加载C++ C++;:向量大小错误,并且大于元素数,c++,opengl,vector,C++,Opengl,Vector,在尝试加载.OBJ-文件时,我将顶点数据加载到std::vectors中,以便稍后将它们发送到GPU。我填充三个向量,用于法线、顶点和纹理坐标。法向量的大小远大于其他两个向量的大小,即使它填充了相同数量的元素 代码: 这似乎非常不合逻辑。程序随后崩溃,出现std::bad_array\u new_length异常,因为Mesh类无法创建大小为2958875950的数组发送到GPU 更新: 如果交换网格顶点和网格法线的声明,网格顶点的大小错误。因此,第一个创建的向量会受到影响 如果我使用std::
.OBJ
-文件时,我将顶点数据加载到std::vectors
中,以便稍后将它们发送到GPU。我填充三个向量,用于法线、顶点和纹理坐标。法向量的大小远大于其他两个向量的大小,即使它填充了相同数量的元素
代码:
这似乎非常不合逻辑。程序随后崩溃,出现std::bad_array\u new_length
异常,因为Mesh
类无法创建大小为2958875950
的数组发送到GPU
更新:
如果交换网格顶点
和网格法线
的声明,网格顶点
的大小错误。因此,第一个创建的向量会受到影响
如果我使用std::list
而不是std::vector
,那么一切都会正常工作
如果我注释掉
…保留(g.faces.size()*3)代码>行,将抛出一个std::bad_alloc
。简单的答案是,开始时的指针指向其他地方,或者:
您正在铸造“场景”结构
在法线向量的场景结构中有垃圾或未设置的指针。可能是在启动函数之前很久就把垃圾放在了那里
您注意到2958875950是垃圾/负整数吗?我猜您在“某处”有一个内存损坏错误,它正在覆盖堆栈上的meshNormals
变量。交换网格法线
和网格顶点
声明会导致网格顶点
变得不好,这一事实与该理论相符
要缩小问题范围,您可以做以下几件事:
注释掉内部for(auto p:f.points)
循环中的所有行,然后查看错误是否仍然发生
假设没有,开始一行一行地取消注释,直到错误再次出现李>
尝试制作一个最小的、独立的测试代码示例来复制问题(如果您在发布SO问题之前这样做,将非常有帮助)
请提供一个。注释掉您正在调用的另一个向量push\u back
。如果数字正确,那么问题可能是内存覆盖或类似的错误。我会试试,我已经尝试了一些东西,现在正在更新问题。我认为场景结构或正常数据都不是问题。我注意到,第一个vector
声明的大小总是错误的。如果我交换meshVertices
和meshNormals
的声明,meshVertices
具有垃圾大小。因此可能是您引用了不同的类型而不是场景直接类到函数?我发现了错误。你可以在接受答案的评论中看到,你是对的<代码>t.toVec()
是错误。该函数有一个bug,它写在它创建的新Vec的末尾。这样,我意外地破坏了位于内存中的std::vector
的大小信息。典型的数组疯狂:D我应该从一开始就使用边界检查。
SceneTree* generateSceneTree(OBJScene* scene){
PostProcessing::triangulateFaces(scene);
SceneNode* node = new SceneNode;
vector<Vec<3>>& sceneNormals = scene->attributeData[Attribute::Normal];
vector<Vec<3>>& sceneVertices = scene->attributeData[Attribute::Position];
vector<Vec<3>>& sceneTexCoords = scene->attributeData[Attribute::TexCoord];
map<string,MaterialInfo*> mtls;
for(string s : scene->mtlLibs){
auto temp = loadMTL(s);
mtls.insert(temp.begin(),temp.end());
}
vector<Vec<3>> meshNormals; <-- creating vectors here.
vector<Vec<3>> meshVertices;
vector<Vec<2>> meshTexCoords;
for(auto g : scene->groups){
meshNormals.clear();
meshNormals.reserve(g.faces.size()*3);
meshVertices.clear();
meshVertices.reserve(g.faces.size()*3);
meshTexCoords.clear();
meshTexCoords.reserve(g.faces.size()*3);
AABB bBox;
cout << "num of faces: " << g.faces.size() << endl;
for(auto f : g.faces){
for(auto p : f.points){
uint vIndex = p.indices[Attribute::Position];
uint nIndex = p.indices[Attribute::Normal];
uint tIndex = p.indices[Attribute::TexCoord];
Vec<3> n = sceneNormals.at(nIndex);
Vec<3> v = sceneVertices.at(vIndex);
Vec<3> t = sceneTexCoords.at(tIndex);
meshNormals.push_back(n);
meshVertices.push_back(v);
meshTexCoords.push_back(t.toVec<2>());
bBox += meshVertices.back();
}
}
cout << "meshNormals size: " << meshNormals.size() << endl;
cout << "meshVertices size: " << meshVertices.size() << endl;
cout << "meshTexCoords size: " << meshTexCoords.size() << endl;
Mesh* m = new Mesh({
{meshVertices,Attribute::Position},
{meshNormals,Attribute::Normal},
{meshTexCoords,Attribute::TexCoord}
},GL_TRIANGLES);
SceneLeaf* leaf = new SceneLeaf;
leaf->nodeData = {Matrix4(),bBox};
leaf->leafData = {m, mtls[g.mtlName]};
node->addChild(leaf);
}
return node;
}
num of faces: 1087474
meshNormals size: 2958875950
meshVertices size: 3262422
meshTexCoords size: 3262422