私は奇妙な問題のように思われる問題を抱えていますが、それは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実行の後半で設定されていないため、クラッシュが発生します。