多次被称为驱动器

Destructor is called multiple times and out of place

本文关键字:驱动器 被称为      更新时间:2023-10-16

ma模型类中的问题是处理它组成的每个网格。当它由7个网格组成时,首先将驱动器称为21次。在退出该程序后,它被称为14次。真的不知道我在做什么错。我能够将问题放在这个特殊的代码中。

void Model::processNode(aiNode *node, const aiScene *scene) {
    for(unsigned int i = 0; i < node->mNumMeshes; i++) {
        aiMesh* mesh = scene->mMeshes[node->mMeshes[i]];
        mMeshes.push_back(processMesh(mesh, scene));
    }
    for(unsigned int i = 0; i < node->mNumChildren; i++) {
        processNode(node->mChildren[i], scene);
    }
}

mmeshes是单个模型对象网格的私人向量。

编辑:

澄清,问题是,当未评论网格类的击曲线时,它会完全破坏MMESHES向量的所有内容。这是网格的攻击方

Mesh::~Mesh () {
    glDeleteVertexArrays(1, &mVAO);
    glDeleteBuffers(NUM_BUFFERS, mVBOs);
}

这是网格的向量。

std::vector<Vertex> mVertices;

和process节点的标题,它只是创建新的网格并将其返回向量。

Mesh Model::processMesh(aiMesh *mesh, const aiScene *scene);

如果您没有在向量中保留足够的内存来容纳新元素,则当添加新元素时,向量可以重新关注内存。在这种情况下,它将分配新的内存扩展,并将所有元素从旧的内存范围复制到新元素。因此,将元素复制到新地方后,删除了旧地方的元素。此外,成员函数push_back可以处理将复制到向量的临时对象,然后将删除。

这是一个指示的程序

#include <iostream>
#include <vector>
#include <string>
struct A
{
    std::string s;
    A(const std::string &s) : s(s)
    {
        std::cout << "Object " << this->s << " is created" << std::endl; 
    }
    A( const A &a ) : s( "copy of " + a.s )
    {
        std::cout << "A " << this->s << " is created" << std::endl;
    }
    ~A()
    {
        std::cout << "Object " << s << " is deleted" << std::endl;
    }
};
int main()
{
    {
        std::vector<A> v;
        v.push_back(A("A"));
        v.push_back(A("B"));
        v.push_back(A("C"));
    }
}

它的输出看起来像

Object A is created
A copy of A is created
Object A is deleted
Object B is created
A copy of copy of A is created
Object copy of A is deleted
A copy of B is created
Object B is deleted
Object C is created
A copy of copy of copy of A is created
A copy of copy of B is created
Object copy of copy of A is deleted
Object copy of B is deleted
A copy of C is created
Object C is deleted
Object copy of copy of copy of A is deleted
Object copy of copy of B is deleted
Object copy of C is deleted