4

私は次のように宣言しました:

std::map<unsigned int, MyClass> *myMap;

特定のクラス A に変換します。このマップは A のコンストラクターで作成されます。

myMap = new std::map<unsigned int, MyClass>;

クラス MyClass は基本的に、いくつかのデータをいくつかのゲッター/セッターとともに格納するための構造体です。MyClass へのポインタや新しいインスタンスはなく、enum 値のペア、unsigned int と bool だけです。したがって、 MyClass デストラクタは空です。

一方、A のデストラクタでは、マップを削除しています。

A::~A(){
    if(myMap!=NULL){
        delete myMap;
        myMap = NULL;
    }
}

ここで、Valgrind は「アドレス 0x4c389b0 は、サイズ 48 free'd[PID:6077] のブロック内に 16 バイトあります」と、delete 行で伝えています。

また、MyClass のデストラクタで、空であっても、「サイズ 8 の無効な書き込み[PID:6077]」が表示されます。

問題があったかどうかわかりません。ベクトルまたはマップに対して削除を呼び出すと、各要素に対応するデストラクタが自動的に呼び出されると常に考えていましたが、この場合、そのデストラクタは何もしません。

何か助けはありますか?

編集: A のコンストラクターを追加:

A::A(unsigned int someValue){
    m_someValue = someValue;
    initializeMap();
}

void A::initializeMap(){
myMap = new std::map<unsigned int, MyClass>;
    for(unsigned int i=1; i<=20; i++)
        mymap->insert(std::make_pair(i,
                MyClass(i)));
}

また、 MyClass コンストラクター:

SvAvailabitlity::SvAvailabitlity(unsigned int index){
    m_index = index; //unsigned int
    m_Flag = false; //bool
        m_enumData1 = NOT_OK; //enum MyEnum
    m_enumData2 = NOT_OK; //enum MyEnum
}

MyEnum は次のように定義されます。

typedef enum {
    OK = 0,
    NOT_OK = 1,
} MyEnum;

ところで、私は反対票を理解していません。スタックオーバーフローのルールに従って正しいと思うこの質問で誰かを怒らせた場合に備えて、誰かがそれを説明してください。

4

1 に答える 1

2

問題は、ルール・オブ・スリー違反です。オブジェクトのコピーにより、ダブルフリーが発生します。

于 2012-11-30T12:58:19.067 に答える