InitInstance()
MFC appObject (つまり)の関数内での変数とオブジェクトの作成を示すコード例がいくつかありますtheApp
。関数内で作成されたものは、関数が終了すると死ぬと思いました。また、InitInstance
ウィンドウを表示した直後に、プログラムが終了する前に関数が終了するように見えます。
私は何が欠けていますか?これはどのように作動しますか?
InitInstance()
MFC appObject (つまり)の関数内での変数とオブジェクトの作成を示すコード例がいくつかありますtheApp
。関数内で作成されたものは、関数が終了すると死ぬと思いました。また、InitInstance
ウィンドウを表示した直後に、プログラムが終了する前に関数が終了するように見えます。
私は何が欠けていますか?これはどのように作動しますか?
はい、あなたは正しいです。自動保存期間を持つ関数スコープで作成されたオブジェクトは、関数が存在すると自動的に破棄されます。
表示されている内容には 2 つの説明が考えられます (質問にサンプル コードが含まれていないため、これ以上絞り込むのは困難です)。
オブジェクトはキーワードを使用して実際に作成されてnew
います。つまり、オブジェクトには動的な保存期間があり、自動的に破棄されません。delete
代わりに、キーワードを使用して手動で破棄する必要があります。の表示に加えてnew
、このスタイルの決定的な特典はポインターの使用です。<code>new は新しいオブジェクトへのポインターを返すため、*
あらゆる場所で表示されます。
オブジェクトは、それが宣言されている関数よりも長く存在する必要はありません。一部のメンバー関数を呼び出せるようにするためだけに、一時的に作成される場合があります。これらのメンバー関数の効果はグローバルであるか、クラス オブジェクト自体を超えた効果があります。ほとんどのクラスは Win32 API のラッパーであるため、これは MFC ではかなり一般的です。
たとえば、このクラスは、 (またはウィンドウへのハンドル)CWnd
で表される、Win32 ウィンドウの単なるオブジェクト指向ラッパーです。オブジェクトをHWND
作成し、それを使用して Windows ウィンドウ ( ) を作成および操作し、基になる Windows ウィンドウに影響を与えずにオブジェクトを破棄できます。ドキュメントの「備考」セクションでは、この紛らわしい動作について少し説明しています。CWnd
HWND
CWnd
CWnd
オブジェクトは Windows ウィンドウとは異なりますが、この 2 つは密接に関連しています。CWnd
オブジェクトは、CWnd
コンストラクタとデストラクタによって作成または破棄されます。一方、Windows ウィンドウは Windows 内部のデータ構造であり、Create
メンバー関数によって作成され、CWnd
仮想デストラクタによって破棄されます。このDestroyWindow
関数は、オブジェクトを破棄せずに Windows ウィンドウを破棄します。
ただし、質問でユビキタスtheApp
オブジェクトについて言及しました。これは少し異なり、関数のスコープ内で宣言されていないため、実際にはグローバルオブジェクトです。プログラムの実行開始時に自動的に構築され、プログラムの終了時に自動的に破棄されます。