2

クラスのインスタンスへのポインタの静的リストを含むクラスを作成しようとしていますが、メモリリークが発生しています。次のコードの何が問題なのか誰かが指摘できるかどうか疑問に思いました。デストラクタか機能のどちらかだと感じていvoid creature::kill()ます。私はアレグロを使用していますが、特別なことを何もしていないいくつかの関数が含まれていないことに注意してください。

まず、クラスヘッダー:

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

1 に答える 1

4
 creature a;

ああ!deleteクリーチャーを呼び出さずにクリーチャーを呼び出すコードがありますnew。これが機能するためには、常にcreaturesを使用して作成する必要がありnew、スタック上に作成しないでください。このクリーチャーがまだスコープ内にいる間に殺された場合はどうなりますか?ブーム。

于 2013-02-25T15:20:35.687 に答える