我正在尝试一个包含指向该类实例的指针的静态列表的类,但是我遇到了内存泄漏。我想知道是否有人可以指出以下代码有什么问题。我感觉它与析构函数或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();
答案 0 :(得分:4)
creature a;
的Ack!你有一个代码可以在一个生物身上调用delete
,而不会在该生物身上调用new
。要使其正常工作,您必须始终使用creature
创建new
,并且永远不要在堆栈上创建它们!如果这个生物仍然在范围内被杀死会发生什么?吊杆。