【问题标题】:Destructor is called multiple times and out of place析构函数被多次调用并且不合适
【发布时间】:2017-04-23 17:03:00
【问题描述】:

ma Model 类中的问题在于处理它所组成的每个网格。当它由 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 是单个模型对象的网格私有向量。

编辑:

澄清一下,问题是当Mesh类的析构函数没有被注释掉时,它完全破坏了mMeshes向量中的一切。这是Mesh的析构函数

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

这是网格的向量。

std::vector<Vertex> mVertices;

和processNode的头部,它只是创建新的网格并将其返回给向量。

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

【问题讨论】:

  • 什么是mMeshesprocessMesh 是做什么的? processNode 做什么?可能有一些你没有注意到的抄袭。
  • 你可能忘了装饰你的复制构造函数。
  • mMeshes.push_back(processMesh(mesh, scene)); 那就是复制城市。
  • 如果您没有发布任何这些类的声明或您所询问的它们的析构函数,我们将无法真正帮助您。
  • 你为什么认为你在做某事错误?代码不起作用吗?看起来您只是在创建大量临时文件,编译器正在正确地发出代码进行清理。这不是非常有效,但也没有错误

标签: c++ memory-management


【解决方案1】:

如果您没有在向量中保留足够的内存来容纳新元素,那么向量可以在添加新元素时重新分配内存。在这种情况下,它分配一个新的内存扩展并将所有元素从旧的内存扩展复制到新的内存扩展。因此,将元素复制到新位置后,旧位置的元素将被删除。此外,成员函数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

【讨论】:

  • 好的,即使在网格向量中保留空间后,它仍然会以一种非常奇怪的方式删除它们。如果我将 print 放入析构函数并在 processNode 函数的第一个 for 循环结束时,这是我得到的输出。德尔网|加工 |德尔网|德尔网|加工 |德尔网|德尔网|德尔网|加工 |德尔网|加工 |德尔网|德尔网|德尔网|德尔网|德尔网|加工 |德尔网|加工 |德尔网|加工 |德尔网|德尔网|德尔网|德尔网|德尔网|德尔网|德尔网|
猜你喜欢
  • 2015-02-25
  • 2012-11-21
  • 1970-01-01
  • 2012-11-05
  • 1970-01-01
  • 1970-01-01
  • 2013-12-11
  • 2012-07-12
相关资源
最近更新 更多