2016-12-08 37 views
-4

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::~Mesh() { 
    glDeleteVertexArrays(1, &mVAO); 
    glDeleteBuffers(NUM_BUFFERS, mVBOs); 
} 

這是Meshes的向量。

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

ok即使在Meshes矢量中保留了空間,它仍然以非常奇怪的方式刪除它們。這是我在將結果放在析構函數中並在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