2016-12-08 8 views
-4

モデルクラスの問題は、それが構成する各メッシュを処理することです。 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は、単一のModelオブジェクトのメッシュのプライベートベクターです。

編集:

明確にするために、問題がメッシュクラスのデストラクタがコメントアウトされていない場合、それは完全に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(mesh、scene));'そのコピーシティがそこにあります。 –

答えて

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

メッシュのベクトルの空き領域を確保した後でも、まだそれは本当に奇妙な方法で削除されます。これは、デストラクターにprintを置くと、processNode関数の最初のforループの最後に出力されます。 デルメッシュ| 処理済み| デルタメッシュ| デルタメッシュ| 処理済み| デルタメッシュ| デルタメッシュ| Del。メッシュ| | 処理中| Del。mesh | | 処理中| Del。mesh | Del。mesh | Del。mesh | Del。mesh | Del。mesh | | 処理中| Del。mesh | | 処理中| Del。mesh | | 処理中| Del。mesh | Del。mesh | Del。mesh | Del。mesh | Del。mesh | Del。mesh | Del。mesh | – Nixx

関連する問題