0

これは私の WinMain メソッドからの抜粋です。完全ではありませんが、問題の核心を説明するには十分だと思います。自動的に削除する必要があるのに、なぜデータ モジュールを明示的に削除するのかを聞かないでください。これはまったく別の問題です (コンストラクターの 1 つを例外として、アプリケーションの初期化が途中で終了した場合のファイナライズの順序が正しくないことに関係しています)。

extern PACKAGE TDataModule_Local *DataModule_Local;

class TDataModule_Local :
   public TDataModule
{
...
public:
   __fastcall        TDataModule_Local(TComponent *Owner);
   __fastcall        ~TDataModule_Local();
}

WINAPI wWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
    Application->Initialize();
    Application->CreateForm(__classid(TMainForm), &MainForm);
    Application->CreateForm(__classid(TDataModule_Local), &DataModule_Local);    
    Application->Run();    

    if (DataModule_Local != NULL)
    {
       delete DataModule_Local;     // destructor not called! why?
       DataModule_Local = NULL;
    }

    return 0;    
}

delete 演算子を使用すると、データ モジュールの奇妙なデストラクタが呼び出されません。Is は、プログラムが WinMain メソッドの囲みブレースに到達した後に呼び出されます。

ここに画像の説明を入力

4

1 に答える 1

1

あなたが言った

自動的に実行する必要があるデータ モジュールを明示的に削除する

明らかに、それを自動的に解放するように設計されているコードは、ファイナライズの順序に関する問題を幸いなことに知らずに、解放しようとしています。

ポインターを NULL に設定したからといって、終了時にクリーンアップされるオブジェクトのリストにポインターのコピーがないというわけではありません。

于 2012-12-07T14:29:18.780 に答える