5

この質問はしばらくの間私を悩ませてきました:私はMSDNのDirectXの記事で次のことを読みました:

(アプリケーションの)デストラクタは、保存されている(Direct2D)インターフェイスを解放する必要があります...

DemoApp::~DemoApp()
{
    SafeRelease(&m_pDirect2dFactory);
    SafeRelease(&m_pRenderTarget);
    SafeRelease(&m_pLightSlateGrayBrush);
    SafeRelease(&m_pCornflowerBlueBrush);
}

さて、アプリケーションのすべてのデータが終了時に解放/割り当て解除されている場合(ソース)、なぜ関数を順番に作成して個別に解放するのに問題が発生するのでしょうか?意味がない!

私はこれを時間の経過とともにますます見続けています、そしてそれは明らかに私を本当に悩ませています。上記のMSDNの記事は、私がこれに遭遇したのは初めてなので、他のすべてのケースについて言及するのは理にかなっています。

さて、これまで私は実際に質問をしていなかったので、ここにあります:

  • 終了する前に何かをリリースする必要がありますか?(理由を説明してください)
  • なぜMSDNの作者はそれを選択したのですか?
  • 答えはネイティブおよびマネージコードとは異なりますか?IE C#プログラムを作成している間、プログラムの最後にすべてが破棄されていることを確認する必要がありますか?(私はJavaについては知りませんが、そこに処分があれば、他のメンバーもその答えを歓迎すると確信しています)。

ありがとうございました!

4

2 に答える 2

3

アプリケーションが終了するときに、管理対象コンテンツについて心配する必要はありません。プロセス全体のメモリが破壊されると、そのすべてがそれに伴います。

重要なのは管理されていないリソースです。

ファイルにロックがあり、ロックを解除せずにアプリケーションを閉じたときにファイルハンドラーのマネージラッパーが削除された場合、ファイルへのアクセスを許可する唯一のキーが破棄されます。

内部バッファ(たとえば、ログエラー用)がある場合は、アプリケーションが終了する前にそれをフラッシュすることをお勧めします。そうしないと、アプリケーションを終了させる致命的なエラーがログに記録されない可能性があります。それは...悪いかもしれません。

ネットワーク接続を開いている場合は、それらを閉じる必要があります。そうしないと、OSはおそらくあなたのためにそれをしません(少なくともしばらくの間;最終的には非アクティブに気付くかもしれません)そしてそれは反対側の誰にとっても失礼です。彼らは、あなたがもうそこにいないことを知らずに、応答を聞き続けているか、あなたに情報を送り続けているかもしれません。

于 2012-11-16T18:50:33.953 に答える
3

さて、アプリケーションのすべてのデータが終了時に解放/割り当て解除されている場合(ソース)、なぜ関数を順番に作成して個別に解放するのに問題が発生するのでしょうか?

いくつかの理由。直接的な理由の1つは、すべてのリソースがメモリであるとは限らないためです。プロセスの終了時にメモリのみが再利用されます。リソースの一部が共有ミューテックスやファイルハンドルなどである場合、それらのリソースを解放しないと、他のプログラムやその後のプログラムの実行が台無しになる可能性があります。

しかし、もっと重要で根本的な理由があると思います。自分の後で片付けないのは、怠惰でずさんなプログラミングです。あなたが終了時のクリーンアップで怠惰でずさんな場合、他の時間に怠惰でずさんですか?あなたの傾向が怠惰でずさんなものであり、潜在的な問題を認識している特定の領域でのみその傾向を無効にする場合、あなたの傾向は怠惰でずさんなものになります。認識していない潜在的な問題がある場合はどうなりますか?怠惰でずさんなプログラミングの全体的な哲学にどのように頼って、正しくて堅牢なプログラムを書くことができますか?

あの男にならないで。自分の後で片付けなさい。

于 2012-11-16T18:53:40.527 に答える