Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:向量大小错误,并且大于元素数_C++_Opengl_Vector - Fatal编程技术网

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