2013-02-25 78 views
2

我想要一個包含指向該類實例的指針的靜態列表的類,但是出現內存泄漏。我想知道是否有人可以指出下面的代碼有什麼問題。我有一種感覺,它要麼與析構函數,或void creature::kill()函數。我注意到我正在使用allegro,但沒有包含一些沒有做任何特殊功能的功能。C++靜態對象指針列表和內存泄漏

第一類的頭:

class creature{ 


    private:  
     //some data for other functions 


    public: 
     static std::list<creature*> mycreatures; 

     creature(); 
     ~creature();      

     void kill(); 


}; 

類.cpp文件

#include "creature.h" 

std::list<creature*>creature::mycreatures; 



creature::creature(){ 
    mycreatures.push_back(this); 

} 

creature::~creature(){ 

    std::list<creature*>::iterator p = 
     find(mycreatures.begin(),mycreatures.end(),this); 
    if(p != mycreatures.end()){ 
     mycreatures.erase(p); 
    } 
} 
void creature::kill(){ 
    if(mycreatures.size()>0){ 
    std::list<creature*>::iterator it = --mycreatures.end (); 
    delete (*it); 
    } 
} 

和主

#include "creature.h" 

void main (void){ 
    creature a; 
    while(!key[KEY_ESC]){ 

     std::list<creature*>::iterator it; 
     for(it=a.mycreatures.begin(); it!=a.mycreatures.end(); it++) 
     { 
     (*it)->//some other non included functions 
     } 
     if(key[KEY_N]){ 
        new creature(); 
    } 
    if(key[KEY_K]){ 
     a.kill(); 
    }  
    } 
    allegro_exit(); 
} 
END_OF_MAIN(); 
+0

'END_OF_MAIN()'做了什麼? – 2013-02-25 14:59:08

+0

https://www.allegro.cc/manual/4/api/using-allegro/end_of_main – BoBTFish 2013-02-25 15:00:30

+0

發生什麼事了? – 2013-02-25 15:00:35

回答

4
creature a; 

確認!你的代碼在生物上呼叫delete,但不會致電該生物的new。爲了這個工作,你必須總是創建creature s使用new並且從不在堆棧上創建它們!如果這個生物在範圍內被殺死會發生什麼?繁榮。

+0

讓我想起更多的staic,最後一個評論和刪除的人,(謝謝)和你關於生物的觀點a;我擺脫了一個,直接通過creat :: mycreatures訪問列表。和生物::殺死。它似乎已經解決了這個問題,所以謝謝你們兩位 – Deengus 2013-02-25 16:17:21