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 のデバッグでは、release() の下で、常に 2 番目のリスト関連のスポットで失敗していることが示されてalive.remove(this) and dead.push_back(this)います。ただし、興味深いことに、printf() ステートメントなどの間に何かを配置すると、クラッシュしません...

ここから呼び出しています:

#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;
}
ガウラフ・セガル

あなたdelete経由で割り当てられたものだけnew

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).

つまりdelete()newTry this で割り当てられていないものを呼び出しています

MemoryObject *foo=new MemoryObject();
foo->release();

編集:これは、以下の理由でまだ機能しません。

内部では、現在のオブジェクトのclean()要素を削除しています。つまり、次のようなことをしていますdeadthis

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

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

std :: listをstd :: copyで複製し、std :: list :: eraseで削除する

分類Dev

std :: listをstd :: listのベクトルに追加する

分類Dev

std :: setをstd :: listに保存します

分類Dev

Std :: Listをクラスメンバー変数として使用することに関する奇妙なエラー

分類Dev

list-initializationを使用して `std :: map <std :: string、CodeInfo>`を初期化する方法は?

分類Dev

Visual C ++ 2012クラスでstd :: vectorまたはstd :: listを使用する

分類Dev

std :: list要素を参照として管理する方法は?

分類Dev

std :: initializer_listをメンバー変数として使用する

分類Dev

std :: initializer_list <double>を使用してコンストラクターを作成する方法

分類Dev

std :: vectorをMPI_Gatherで使用すると、cスタイルの配列が正常に機能しているときにクラッシュします

分類Dev

std :: initializer_listと参照型

分類Dev

std :: list <std :: string>をランダム化します

分類Dev

std :: unordered_mapのstd :: list要素を初期化しています

分類Dev

イテレータを使用してstd :: listをソートする

分類Dev

ブーストptreeを使用してstd :: listをjsonにシリアル化する

分類Dev

std :: initializer_list <char const *>からstd :: vector <std :: string>を構築する方法

分類Dev

`[](std :: list <int>&list){return std :: move(list)}(list)`は `list`を空のままにすることが保証されていますか?

分類Dev

Save std::set in std::list

分類Dev

初期化リストを値として使用すると、std :: list <std :: vector <int >>への挿入に失敗しましたか?

分類Dev

さまざまな長さのリストのconstリストとしてstd :: initializer_list []を使用する

分類Dev

カスタムアロケータを使用してstd :: listキャッシュを使いやすくしますか?

分類Dev

キャッシュフレンドリーstd :: list vs std :: vector

分類Dev

空でないstd :: list <int>でstd :: list.back()を使用しているときに「セグメンテーション違反」

分類Dev

std :: initializer_listを使用せずにテンプレート化されたクラスをリストして、サイズを固定する方法

分類Dev

直接初期化とstd :: initializer_listを使用する場合の異なる命令

分類Dev

std :: listに対するstd :: prevおよびstd :: nextの有効性

分類Dev

std :: ostreamをクラスメンバーとして使用する

分類Dev

`std :: list :: splice(std :: const_iterator pos、std :: list && other)`は `other`を空のままにすることが保証されていますか?

分類Dev

initializer_listエラーからstd :: mapを構築する

Related 関連記事

  1. 1

    std :: listをstd :: copyで複製し、std :: list :: eraseで削除する

  2. 2

    std :: listをstd :: listのベクトルに追加する

  3. 3

    std :: setをstd :: listに保存します

  4. 4

    Std :: Listをクラスメンバー変数として使用することに関する奇妙なエラー

  5. 5

    list-initializationを使用して `std :: map <std :: string、CodeInfo>`を初期化する方法は?

  6. 6

    Visual C ++ 2012クラスでstd :: vectorまたはstd :: listを使用する

  7. 7

    std :: list要素を参照として管理する方法は?

  8. 8

    std :: initializer_listをメンバー変数として使用する

  9. 9

    std :: initializer_list <double>を使用してコンストラクターを作成する方法

  10. 10

    std :: vectorをMPI_Gatherで使用すると、cスタイルの配列が正常に機能しているときにクラッシュします

  11. 11

    std :: initializer_listと参照型

  12. 12

    std :: list <std :: string>をランダム化します

  13. 13

    std :: unordered_mapのstd :: list要素を初期化しています

  14. 14

    イテレータを使用してstd :: listをソートする

  15. 15

    ブーストptreeを使用してstd :: listをjsonにシリアル化する

  16. 16

    std :: initializer_list <char const *>からstd :: vector <std :: string>を構築する方法

  17. 17

    `[](std :: list <int>&list){return std :: move(list)}(list)`は `list`を空のままにすることが保証されていますか?

  18. 18

    Save std::set in std::list

  19. 19

    初期化リストを値として使用すると、std :: list <std :: vector <int >>への挿入に失敗しましたか?

  20. 20

    さまざまな長さのリストのconstリストとしてstd :: initializer_list []を使用する

  21. 21

    カスタムアロケータを使用してstd :: listキャッシュを使いやすくしますか?

  22. 22

    キャッシュフレンドリーstd :: list vs std :: vector

  23. 23

    空でないstd :: list <int>でstd :: list.back()を使用しているときに「セグメンテーション違反」

  24. 24

    std :: initializer_listを使用せずにテンプレート化されたクラスをリストして、サイズを固定する方法

  25. 25

    直接初期化とstd :: initializer_listを使用する場合の異なる命令

  26. 26

    std :: listに対するstd :: prevおよびstd :: nextの有効性

  27. 27

    std :: ostreamをクラスメンバーとして使用する

  28. 28

    `std :: list :: splice(std :: const_iterator pos、std :: list && other)`は `other`を空のままにすることが保証されていますか?

  29. 29

    initializer_listエラーからstd :: mapを構築する

ホットタグ

アーカイブ