3

このコードがあるとします...

class GraphFactory : public QObject
{
private:
    QMap<QString, IGraphCreator*> factory_;

public:
    virtual ~GraphFactory();
};

GraphFactory::~GraphFactory()
{
    // Free up the graph creators
    QMap<QString, IGraphCreator*>::iterator itr;
    for (itr = factory_.begin(); itr != factory_.end(); itr++)
    {
        IGraphCreator * creator = itr.value();
        delete creator;
        creator = NULL;
    }

}

QMap factory_ はいつ破棄されますか? デストラクタへの呼び出し前、またはデストラクタ中? (GraphFactory のインスタンスが範囲外になると、デストラクタが呼び出されることは理解しています。しかし、ポインタ以外のメンバーはいつ破棄されますか?)

編集:デストラクタに到達すると、factory_ マップの無効な値が取得されます。ブレーク ポイントは、値が QMap 内に格納されている値と改ざんされていないことを示しています。

4

3 に答える 3

11

デストラクタ コードが実行されたに破棄されます。

アイデアは、デストラクタ コードでメンバーにアクセスして、実行後にメンバーが破棄されるようにすることです。

于 2009-10-06T10:23:24.030 に答える
2

GraphFactory::~GraphFactory、しかし前にQObject::~QObject。したがって、実際にはデストラクタ間です。

于 2009-10-06T10:24:57.350 に答える
1

デストラクタが呼び出されたときに GraphFactory::factory_ メンバーに格納されたデータが無効である場合、これが発生する可能性があるいくつかの方法があります。

Windows で実行している場合、Application Verifierなどのツールは、この種の問題をデバッグするときに非常に役立ちます (これを使用してページ ヒープ機能を有効にし、問題を再現するときにデバッガーをアタッチします)。

マルチスレッド環境で GraphFactory クラスを使用している場合は、QMap インスタンスへのアクセスを同期する必要があります。そうしないと「悪いこと」が発生する可能性があるためです。

他のプラットフォーム用の同等のツールについては知りません。これを読んでいる人がたまたま知っているなら、彼らについて聞いてみたいです。

于 2009-10-06T10:50:22.860 に答える