繁体   English   中英

C ++:向量大小错误并且大于元素数量

[英]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。

更新:

如果我交换meshVerticesmeshNormals的声明,则meshVertices的大小错误。 因此,第一个创建的向量会受到影响。

如果我使用std::list而不是std::vector ,则一切正常。

如果我注释掉....reserve(g.faces.size()*3); 行,将引发std::bad_alloc

简单的答案是,您开始时的指针指向其他地方:

  1. 您正在转换“场景”结构。
  2. 您在法线向量的场景结构中有垃圾或未设置指针。 可能是您在进入函数之前将垃圾放置了很远。

您是否注意到2958875950是垃圾/负整数?

我的猜测是您有一个“内存损坏”错误,该错误“覆盖某处”的meshNormals变量。 交换meshNormalsmeshVertices声明会导致meshVertices变坏的事实符合该理论。

要缩小问题的范围,您可以做一些事情:

  1. 注释掉内部for(auto p : f.points)循环中的所有行,并查看错误是否仍然发生。
  2. 假设没有,开始逐行取消注释,直到错误再次出现。
  3. 尝试制作一个最小的,独立的测试代码示例来重复该问题(如果您在发布SO问题之前进行了此操作,将极大地帮助您)。

c++ 向量指针没有正确大小的向量<object> * ptr, ptr-&gt;size 错误<div id="text_translate"><p>这是我的代码</p><pre>#include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;string&gt; using namespace std; struct Student // EdgeContainer { string name = ""; vector&lt;string&gt; *addresses = nullptr; Student() { cout &lt;&lt; __FILE__ &lt;&lt; " " &lt;&lt; __LINE__ &lt;&lt; " Student()" &lt;&lt; endl; } Student(const Student &amp;stu) { cout &lt;&lt; __FILE__ &lt;&lt; " " &lt;&lt; __LINE__ &lt;&lt; " Student(const Student &amp;stu)" &lt;&lt; endl; name = stu.name; addresses = stu.addresses; } void print() { cout &lt;&lt; name &lt;&lt; " " &lt;&lt; addresses &lt;&lt; " size=" &lt;&lt; addresses-&gt;size() &lt;&lt; endl; if (addresses;= nullptr) { for (int i = 0; i &lt; addresses-&gt;size(); i++) { cout &lt;&lt; i &lt;&lt; " " &lt;&lt; (*addresses)[i] &lt;&lt; endl; } } cout &lt;&lt; "----------------\n"; } }; struct Printer //ToyView { vector&lt;Student *&gt; students; vector&lt;vector&lt;string&gt;&gt; stu_addresses; void add_student() { for (int i = 0; i &lt; 10; i++) { vector&lt;string&gt; address. address;push_back("addr1"). address;push_back("addr2"). stu_addresses;push_back(address); Student *stu = new Student. students;push_back(stu); students[i]-&gt;name = "stu" + to_string(i); students[i]-&gt;addresses = &amp;stu_addresses[i]; cout &lt;&lt; i &lt;&lt; " stu-&gt;address=" &lt;&lt; stu-&gt;addresses &lt;&lt; " size=" &lt;&lt; stu-&gt;addresses-&gt;size() &lt;&lt; endl. } } void print() { cout &lt;&lt; " students size=" &lt;&lt; students;size() &lt;&lt; endl; for (int i = 0. i &lt; students;size(); i++) { cout &lt;&lt; i &lt;&lt; " stu-&gt;address=" &lt;&lt; students[i]-&gt;addresses &lt;&lt; endl; // students[i]-&gt;addresses = &amp;stu_addresses[i]; students[i]-&gt;print(); } } }; int main() { Printer printer. printer;add_student(). printer;print(); return 0; }</pre><p> 这是一些结果:</p><pre> ../vector_cp.cpp 13 Student() 0 stu-&gt;address=0x563888ac6f30 size=2../vector_cp.cpp 13 Student() 1 stu-&gt;address=0x563888ac7418 size=2../vector_cp.cpp 13 Student() 2 stu-&gt;address=0x563888ac74f0 size=2../vector_cp.cpp 13 Student() 3 stu-&gt;address=0x563888ac7508 size=2../vector_cp.cpp 13 Student() 4 stu-&gt;address=0x563888ac76c0 size=2../vector_cp.cpp 13 Student() 5 stu-&gt;address=0x563888ac76d8 size=2../vector_cp.cpp 13 Student() 6 stu-&gt;address=0x563888ac76f0 size=2../vector_cp.cpp 13 Student() 7 stu-&gt;address=0x563888ac7708 size=2../vector_cp.cpp 13 Student() 8 stu-&gt;address=0x563888ac7a10 size=2../vector_cp.cpp 13 Student() 9 stu-&gt;address=0x563888ac7a28 size=2 students size=10 0 stu-&gt;address=0x563888ac6f30 stu0 0x563888ac6f30 size=18446744073709549283</pre><p> 我希望 students[0]-&gt;addresses.size() 应该是 2,但它显示了垃圾编号。 取消注释此行后 // students[i]-&gt;addresses = &amp;stu_addresses[i]; 代码实际上是有效的,即students[0]-&gt;addresses.size()。 我仍然无法弄清楚为什么会这样。 任何人都可以帮忙吗?</p></div></object>

[英]c++ vector pointer does not have correct size vector<Object>* ptr, ptr->size is wrong

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 C.size()之后失去向量元素 矢量C ++大小和访问元素 具有可变大小元素的C ++“向量” 元素少于数组大小 C++ 当向量中唯一元素的数量远小于向量大小时,有效地处理向量的每个唯一排列 矢量c ++矢量的大小 c ++ 矢量大小。 为什么 -1 大于零 调整小于连续数组的C ++向量大小? 获取所有大于值的向量元素c ++ c++ 向量指针没有正确大小的向量<object> * ptr, ptr-&gt;size 错误<div id="text_translate"><p>这是我的代码</p><pre>#include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;string&gt; using namespace std; struct Student // EdgeContainer { string name = ""; vector&lt;string&gt; *addresses = nullptr; Student() { cout &lt;&lt; __FILE__ &lt;&lt; " " &lt;&lt; __LINE__ &lt;&lt; " Student()" &lt;&lt; endl; } Student(const Student &amp;stu) { cout &lt;&lt; __FILE__ &lt;&lt; " " &lt;&lt; __LINE__ &lt;&lt; " Student(const Student &amp;stu)" &lt;&lt; endl; name = stu.name; addresses = stu.addresses; } void print() { cout &lt;&lt; name &lt;&lt; " " &lt;&lt; addresses &lt;&lt; " size=" &lt;&lt; addresses-&gt;size() &lt;&lt; endl; if (addresses;= nullptr) { for (int i = 0; i &lt; addresses-&gt;size(); i++) { cout &lt;&lt; i &lt;&lt; " " &lt;&lt; (*addresses)[i] &lt;&lt; endl; } } cout &lt;&lt; "----------------\n"; } }; struct Printer //ToyView { vector&lt;Student *&gt; students; vector&lt;vector&lt;string&gt;&gt; stu_addresses; void add_student() { for (int i = 0; i &lt; 10; i++) { vector&lt;string&gt; address. address;push_back("addr1"). address;push_back("addr2"). stu_addresses;push_back(address); Student *stu = new Student. students;push_back(stu); students[i]-&gt;name = "stu" + to_string(i); students[i]-&gt;addresses = &amp;stu_addresses[i]; cout &lt;&lt; i &lt;&lt; " stu-&gt;address=" &lt;&lt; stu-&gt;addresses &lt;&lt; " size=" &lt;&lt; stu-&gt;addresses-&gt;size() &lt;&lt; endl. } } void print() { cout &lt;&lt; " students size=" &lt;&lt; students;size() &lt;&lt; endl; for (int i = 0. i &lt; students;size(); i++) { cout &lt;&lt; i &lt;&lt; " stu-&gt;address=" &lt;&lt; students[i]-&gt;addresses &lt;&lt; endl; // students[i]-&gt;addresses = &amp;stu_addresses[i]; students[i]-&gt;print(); } } }; int main() { Printer printer. printer;add_student(). printer;print(); return 0; }</pre><p> 这是一些结果:</p><pre> ../vector_cp.cpp 13 Student() 0 stu-&gt;address=0x563888ac6f30 size=2../vector_cp.cpp 13 Student() 1 stu-&gt;address=0x563888ac7418 size=2../vector_cp.cpp 13 Student() 2 stu-&gt;address=0x563888ac74f0 size=2../vector_cp.cpp 13 Student() 3 stu-&gt;address=0x563888ac7508 size=2../vector_cp.cpp 13 Student() 4 stu-&gt;address=0x563888ac76c0 size=2../vector_cp.cpp 13 Student() 5 stu-&gt;address=0x563888ac76d8 size=2../vector_cp.cpp 13 Student() 6 stu-&gt;address=0x563888ac76f0 size=2../vector_cp.cpp 13 Student() 7 stu-&gt;address=0x563888ac7708 size=2../vector_cp.cpp 13 Student() 8 stu-&gt;address=0x563888ac7a10 size=2../vector_cp.cpp 13 Student() 9 stu-&gt;address=0x563888ac7a28 size=2 students size=10 0 stu-&gt;address=0x563888ac6f30 stu0 0x563888ac6f30 size=18446744073709549283</pre><p> 我希望 students[0]-&gt;addresses.size() 应该是 2,但它显示了垃圾编号。 取消注释此行后 // students[i]-&gt;addresses = &amp;stu_addresses[i]; 代码实际上是有效的,即students[0]-&gt;addresses.size()。 我仍然无法弄清楚为什么会这样。 任何人都可以帮忙吗?</p></div></object>
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM