2016-12-08 4 views
-4

Проблема в классе 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 - частный вектор сетки для одного объекта модели.

Edit:

Чтобы уточнить, проблема заключается в том, что, когда деструктор класса Mesh не закомментирована, он полностью уничтожает все в mMeshes векторе. Это деструктор сетки

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

это вектор Мешей.

std::vector<Vertex> mVertices; 

и заголовок processNode, он просто создает новую сетку и возвращает ее вектору.

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

Что такое 'mMeshes'? Что делает 'processMesh'? Что делает 'processNode'? Вероятно, происходит какое-то копирование, которое вы не заметите. –

+2

Возможно, вы забыли украсить свой конструктор копий. – NathanOliver

+6

'mMeshes.push_back (processMesh (сетка, сцена)); это копия города прямо там. –

ответ

0

Если вы не зарезервировали достаточное количество памяти в векторе для размещения новых элементов, тогда вектор может перераспределять память при добавлении нового элемента. В этом случае он выделяет новую область памяти и копирует все элементы из старой степени памяти в новую. Поэтому после копирования элементов на новое место элементы в старом месте удаляются. Также функция-член 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 
+0

ok даже после резервирования пространства в векторе Meshes, он по-прежнему удаляет их по-настоящему странным образом. Это результат, который я получаю, если я помещаю печать в деструктор и в конце первого цикла for в функции processNode. Del. сетчатые | Обработанные |. Del сетки |. Del сетки | Обработанные |. Del сетки |. Del сетки | Del.сетка | Обработано | Del. Сетка | Обработано | Del. Сетка | Del. Сетка | Del. Сетка | Del. Сетка | Del. Сетка | Обработано | Del. Сетка | Обработано | Del. Сетка | Обработано | Del. Сетка | Del. Сетка | Del. Сетка | Del. Сетка | Del. Сетка | Del. Сетка | Del. Сетка | – Nixx

Смежные вопросы