C ++静态对象指针列表和内存泄漏

时间:2013-02-25 14:57:23

标签: c++ list pointers memory-leaks

我正在尝试一个包含指向该类实例的指针的静态列表的类,但是我遇到了内存泄漏。我想知道是否有人可以指出以下代码有什么问题。我感觉它与析构函数或void creature::kill()函数有关。我注意到我正在使用allegro,但没有包含一些没有做任何特殊功能的功能。

首先是类标题:

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();

1 个答案:

答案 0 :(得分:4)

 creature a;

的Ack!你有一个代码可以在一个生物身上调用delete,而不会在该生物身上调用new。要使其正常工作,您必须始终使用creature创建new,并且永远不要在堆栈上创建它们!如果这个生物仍然在范围内被杀死会发生什么?吊杆。