10

Andrei Alexandrescu のThe D Programming Languageを読んでいて、ティアダウン シーケンスでこのナゲットを見つけました。

...D は、アプリケーションを終了すると、それに関連付けられているすべてのリソースが事実上解放されると想定しているため、デストラクタは呼び出されません。

これはメモリ リソースに対してはうまく機能しますが、ネットワーク ソケット、カスタム ハードウェア、ファイル ハンドルなどについてはどうでしょうか。デストラクタが常に呼び出されることを保証する方法はありますか? あるいは、D はこれらのことを処理するためのより良い方法を提供しますか (そして、私は C++ の考え方にとらわれています)?

4

3 に答える 3

6

スレッドの終了時に呼び出される静的デストラクタと、(通常の) アプリケーションのシャットダウン時に呼び出される共有静的デストラクタを使用できます。

(今、弱い参照があれば、別のレベルの間接化は必要ありません...)

于 2012-05-27T03:15:43.520 に答える
3

他の人はモジュール レベルのデストラクタについて言及していますが、手動のメンテナンスが多すぎるため実際には実用的ではありません。D には、静的コンストラクタ/デストラクタを持つモジュールが循環インポートを持てないという苛立たしい癖があります。例えば:

モジュール A

module A;
import B;
static ~this() {}
void main() {}

モジュール B

module B;
import A;
static ~this() {}

走ってみて…

% dmd A.d B.d
% ./A
Cycle detected between modules with ctors/dtors:
A -> B -> A
object.Exception@src/rt/minfo.d(331): Aborting!

D は、デストラクタが相互に依存していない場合でも、たまたま相互に依存している場合に備えて、これを行います。これにより、コードの奇妙な「リファクタリング」を実行して、この問題を回避する必要があります。実際に依存関係がないことを D に伝える方法はありません。

リソースの破棄を処理するためのより良い解決策は、可能な限りスコープを設定することです。破棄が必要なグローバル リソースは使用しないでください。また、クラス ファイナライザーに依存しないでください。実行が保証されていないためです(Java にも同じ問題があります)

または、C で行うのと同じように実行してください: 手動シャットダウン。もう少し手間がかかりますが、実際には大きな問題ではありません。循環的な輸入に取り組むよりも確かに簡単です。

于 2012-05-27T14:53:20.800 に答える
0
  • プロセスを強制終了すると、プロセス内部のすべてがクリーンアップされます。
  • プロセスの外部にあるものをクリーンアップする前に、OS がプロセスを強制終了するのを防ぐ方法はありません (もしあったとしても、電力損失はそれを無効にします)。

それらの 2 つの間で、すべてがカバーされているため、物事がどのようにシャットダウンするかについて発言権があると仮定するのはかなり無意味です.

于 2012-06-05T06:10:15.217 に答える