[英]C++: vector size is wrong and higher than the number of elements
在尝试加载.OBJ
文件时,我将顶点数据加载到std::vectors
,以便稍后将其发送到GPU。 我填充了三个向量,分别是法线,顶点和纹理坐标。 即使法线向量填充了相同数量的元素,它的大小也远高于其他两个向量的大小。
码:
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
这似乎非常不合逻辑。 此后,程序由于std::bad_array_new_length
异常而std::bad_array_new_length
因为Mesh
类无法创建大小为2958875950
的数组以发送给GPU。
更新:
如果我交换meshVertices
和meshNormals
的声明,则meshVertices
的大小错误。 因此,第一个创建的向量会受到影响。
如果我使用std::list
而不是std::vector
,则一切正常。
如果我注释掉....reserve(g.faces.size()*3);
行,将引发std::bad_alloc
。
简单的答案是,您开始时的指针指向其他地方:
您是否注意到2958875950是垃圾/负整数?
我的猜测是您有一个“内存损坏”错误,该错误“覆盖某处”的meshNormals
变量。 交换meshNormals
和meshVertices
声明会导致meshVertices
变坏的事实符合该理论。
要缩小问题的范围,您可以做一些事情:
for(auto p : f.points)
循环中的所有行,并查看错误是否仍然发生。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.