0

私は奇妙な問題のように思われる問題を抱えていますが、それはQMapの動作の癖である可能性があり、私はそれを理解していません。問題を要約するのは難しいですが、私は最善を尽くします。

のクラスAがありQMap<QString, someType*> mySomeTypeMap;ます。プログラムに新しいファイルをロードするときに、このファイルのすべての内容を削除してQMap、新しいデータを再入力できるようにします。私は次のことを行うことによってそれを行います:

foreach (QString key, mySomeTypeMap.keys())
{
    someType* toDelete = mySomeTypeMap.take(key);

    //Show me the original address of the pointer
    qDebug() << "toDelete: " << toDelete;

    delete toDelete;

    //Set the pointer to 0x0
    toDelete = NULL;
}

このqDebug()ステートメントは、削除したい値の正しいアドレスを出力しtoDeleteます。デバッガーで設定された後に見るとNULL、0x0と表示されます。これは私が望むものです。

その後、別のクラスBで、次のコードがあります...

void B::setSomeType(someType* blah)
{
    if (Blah != NULL)
    {
        //Calls a bunch of disconnect()'s
        disconnectAllSignals();

        Blah = blah;

        //Calls a bunch of connect()'s
        connectAllSignals();
    }
}

さて、本当に紛らわしいのは、プログラムがdisconnectAllSignals();ラインに到達したときにクラッシュすることです。disconnect()その理由は、削除されたものを呼び出そうとしているためBlah、に設定したときに0x0に設定されているはずNULLです。ただし、実際に設定されNULLている場合は、そもそもそのif-blockに入ることができませんでした。デバッガーでは、のアドレスは、設定の直前Blahに印刷したときに取得したものとまったく同じであることがわかります。qDebug() << "toDelete: " << toDelete;toDelete = NULL;

TLDR; ポインタを削除して同じポインタをに設定した後、プログラムがポインタの元のアドレスをどのように取得しているかわかりませんNULL。ポインタはNULL実行の後半で設定されていないため、クラッシュが発生します。

4

2 に答える 2

3

マップ内の値は、ポインター(ポインターが指すアドレス)が値で格納されていることを意味する場合でも、値で格納されます。例えば:

someType* toDelete1 = mySomeTypeMap.take(key);
someType* toDelete2 = mySomeTypeMap.take(key);
someType* toDelete3 = toDelete1;
toDelete1 = NULL;

toDelete2とtoDelete3は引き続き元のオブジェクトを指します

削除後にポインタをnullにする代わりに、マップからポインタを削除するか、そのキーの値をNULLに設定する必要があります。

于 2013-01-15T15:23:10.523 に答える
2
someType* toDelete = mySomeTypeMap.take(key);

これはスタック上に作成されたポインター変数であり、その値はマップに保持している値に設定されます。すぐにスコープから外れるため、NULLに設定する必要はありません。

take関数はマップからポインタを削除しています。同じキーで再度使用すると、デフォルトで作成された値が返されます。deleteしようとした直後

mySomeTypeMap.insert(key, 0);
于 2013-01-15T15:36:26.833 に答える