1

InitInstance()MFC appObject (つまり)の関数内での変数とオブジェクトの作成を示すコード例がいくつかありますtheApp。関数内で作成されたものは、関数が終了すると死ぬと思いました。また、InitInstanceウィンドウを表示した直後に、プログラムが終了する前に関数が終了するように見えます。

私は何が欠けていますか?これはどのように作動しますか?

4

1 に答える 1

3

はい、あなたは正しいです。自動保存期間を持つ関数スコープで作成されたオブジェクトは、関数が存在すると自動的に破棄されます。

表示されている内容には 2 つの説明が考えられます (質問にサンプル コードが含まれていないため、これ以上絞り込むのは困難です)。

  1. オブジェクトはキーワードを使用して実際に作成されてnewいます。つまり、オブジェクトには動的な保存期間があり、自動的に破棄されません。delete代わりに、キーワードを使用して手動で破棄する必要があります。の表示に加えてnew、このスタイルの決定的な特典はポインターの使用です。<code>new は新しいオブジェクトへのポインターを返すため、*あらゆる場所で表示されます。

  2. オブジェクトは、それが宣言されている関数よりも長く存在する必要はありません。一部のメンバー関数を呼び出せるようにするためだけに、一時的に作成される場合があります。これらのメンバー関数の効果はグローバルであるか、クラス オブジェクト自体を超えた効果があります。ほとんどのクラスは Win32 API のラッパーであるため、これは MFC ではかなり一般的です。

    たとえば、このクラスは、 (またはウィンドウへのハンドル)CWndで表される、Win32 ウィンドウの単なるオブジェクト指向ラッパーです。オブジェクトをHWND作成し、それを使用して Windows ウィンドウ ( ) を作成および操作し、基になる Windows ウィンドウに影響を与えずにオブジェクトを破棄できます。ドキュメントの「備考」セクションでは、この紛らわしい動作について少し説明しています。CWndHWNDCWnd

    CWndオブジェクトは Windows ウィンドウとは異なりますが、この 2 つは密接に関連しています。CWndオブジェクトは、CWndコンストラクタとデストラクタによって作成または破棄されます。一方、Windows ウィンドウは Windows 内部のデータ構造であり、Createメンバー関数によって作成され、CWnd仮想デストラクタによって破棄されます。このDestroyWindow関数は、オブジェクトを破棄せずに Windows ウィンドウを破棄します。

ただし、質問でユビキタスtheAppオブジェクトについて言及しました。これは少し異なり、関数のスコープ内で宣言されていないため、実際にはグローバルオブジェクトです。プログラムの実行開始時に自動的に構築され、プログラムの終了時に自動的に破棄されます。

于 2013-05-26T13:25:05.203 に答える