2017-07-06 1 views
0

メモリ管理を行うためのコードがありますが、「ライブ」リストからオブジェクトを削除して「死んだ」リストに配置する特定のポイントでクラッシュし続けます。 1:std :: listを連続して使用するとクラッシュする

class MemoryObject { 
private: 
    static std::list <MemoryObject *> alive, dead; 
    long references; 
public: 
    MemoryObject() { 
     alive.push_back(this); 
     references = 0; 
    } 

    static void deepClean() { 
     clean(); 
     std::list<MemoryObject *>::iterator iterator; 
     for(iterator = alive.begin(); iterator != alive.end(); iterator ++) { 
      MemoryObject *object = *iterator; 
      Log::instance().write(DEBUG_LOG, "\nObject still active at the end of the program, check for memory leaks." 
        "\nSize: %d", 
        alive.size()); 
      delete object; 
     } 
     alive.clear(); 
    } 

    void reference() { 
     references ++; 
    } 

    void release() { 
     references --; 
     if(references <= 0) { 
      dead.push_back(this); 
      alive.remove(this); 
     } 
    } 

    static void clean() { 
     std::list<MemoryObject *>::iterator iterator; 
     for(iterator = dead.begin(); iterator != dead.end(); iterator ++) 
      delete(&iterator); 
     dead.clear(); 
    } 

    ~MemoryObject() { 
     clean(); 
    } 
}; 

std::list <MemoryObject *> MemoryObject::alive, MemoryObject::dead; 

Eclipseのデバッグは常に第二のリストに関連したスポットで、)(それはリリースで失敗を示す - 私は何も変化しない異なるため、それらに(alive.remove(this) and dead.push_back(this))を入れて試してみました。あなたのclean

#include <stdlib.h> 
#include <stdio.h> 

#include "log/log.hpp" 
#include "memory/object.hpp" 

int main(int argc, char *argv[]) { 
    MemoryObject foo; 
    foo.release(); 
    MemoryObject::deepClean(); 
    return 0; 
} 
+5

のようなものをやっている短いにおける現在のobject.Soのthisあるdeadの要素を削除します。それは間違いない。 –

+1

どのように関数を呼び出すかを示してください。 –

+1

これを読んでください:[mcve] –

答えて

0

deletenewによって割り当てられたもののみ。

MemoryObject foo; 
foo.release(); 

とクリーン

for(iterator = dead.begin(); iterator != dead.end(); iterator ++) 
     delete(*iterator); //I am assuming you have * instead of &(which is incorrect as mentioned in another answer). 

内ですから、newによって割り当てられていない何かにdelete()を呼んでいるが、これを試してみてください。

​​

編集:これは、以下の理由でまだ機能しません。 clean()インサイド

あなたは `あなたが`削除(&イテレータ)持っているあなたの `clean`機能では、この

class A 
{ 
    void delete_this() 
    { 
     delete(this); 
     //At this point "this" is a dangling pointer and you should not use it. 
    } 
}; 
1

:私はからそれを呼んでいるところ興味深いことにしかし、...私はprintfの()文と同様に、それがクラッシュしない、で-の間にそれらに何かを置く場合

ここですあなたが持っている機能:コンパイルしますが、反復子自体を削除しようとします

delete(&iterator); 

- (クラッシュする)スタックにあります。

私はあなたが望んでいた疑いがある:

delete(*iterator); 
1

あなたが新しいと割り当てられていないオブジェクトを削除することはできません。 MemoryObject foo;はnewでallocatetdされていません。

関連する問題