C ++コア原則C.31:デストラクタでリリースされるすべてのリソース要求

C.31:クラスによって得られたすべてのリソースは、クラスのデストラクタによって解放されなければなりません

デストラクタを解放する必要があり、すべてのリソースアプリケーション

 

理由(理由)

特にエラーケースでのリソースリークの防止、。

特にエラーが発生した場合には、リソースリークを避けてください。

 

Note(注意)

デフォルトの操作の完全なセットを持つクラスとして表現リソースについては、これは自動的に行われます。

自動的に行われますクラスのデフォルトのアクションのフルセット、実現のためのリソースのパフォーマンスの場合。

 

実施例(実施例)

 

class X {    ifstream f;   // may own a file    // ... no default operations defined or =deleted ...};

Xさんはifstreamは、暗黙のうちに、そのXの破壊時に開いている可能性のあるファイルをクローズ

クラスXのはifstreamのデストラクタのメンバーによって暗黙的に近い任意の任意のドキュメントを開きます。

 

例えば、悪い(陰性試料)

​​​​​​​

class X2 {     // bad    FILE* f;   // may own a file    // ... no default operations defined or =deleted ...};

X2は、ファイルハンドルをリークすることがあります。

リークのファイルハンドルの可能性がX2を存在します。(具体的に通常は翻訳者注、近いファイルがありません)

 

Note(注意)

どのようなことではないでしょう近いソケットのでしょうか?デストラクタ、クローズ、またはクリーンアップ操作が失敗することはありません。それはそれにもかかわらずない場合、我々は何も本当に良い解決策を持っていない問題を抱えています。手始めに、デストラクタの作家は、デストラクタが呼び出されると、例外をスローすることによって、「ゴミは行動する」ことができない理由を知りません。説明を参照してください。問題はさらに悪いことに、多くの「クローズ/解除」の操作が再試行可能ではありません。多くは、この問題を解決しようとしましたが、一般的な解決策は知られていません。すべての可能で、近い/クリーンアップに失敗基本設計誤差を考慮して終了した場合。

sokcet(通信、翻訳者注)何が起こるかシャットダウンされていませんか?まず、デストラクタ、オフまたはクリア操作が失敗することはありません。それができないのならば、この問題は本当に良い解決策ではありません。(通信、翻訳者注)ヘッドモジュールの場合は、著者が原因と呼ばれるもののデストラクタデストラクタを知らない、と何の道が例外をスローすることはありません「に対処することを拒否しました。」議論(https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#Sd-never-fail)を参照してください。もっと真剣に、多くの「クローズ/解除」操作を再試行することはできません。この問題を解決するためではない一般的な解決策を見つけるためにすることなく、多くの試みがなされています。可能であれば、失敗した根本的なエラーと終了と見をオフにするか、削除します。

 

Note(注意)

このクラスは、それが所有していないことをオブジェクトへのポインタと参照を保持することができます。もちろん、そのようなオブジェクトは、クラスのデストラクタによって削除すべきではありません。例えば:

クラスは、それが所有、または参照を持たないオブジェクトへのポインタを保持することができます。明らかに、そのようなオブジェクトは、クラスデストラクタを破壊すべきではありません。例えば:

​​​​​​​

Preprocessor pp { /* ... */ };Parser p { pp, /* ... */ };Type_checker tc { p, /* ... */ };

ここで、pは頁を参照するが、それを所有していません。

pは、PPを指すが、頁を持たないところ。

 

施行(提案)

  • クラスが(例えば、GSL ::所有者を使用することにより、所有者とみなされる)所有者であるポインタまたは参照メンバ変数を持っている場合(シンプル)は、その後、彼らはそのデストラクタで参照する必要があります。

    (単純な)クラスは、ポインタまたは基準部材(例えば、所有GSL ::所有者を宣言することによって)、それらはデストラクタで参照されるべき独自を含む場合。

    翻訳者注:個人的にはデストラクタで解放されるべきだと思います。

  • 所有権(例えば、コンストラクタに見て)の明示的な文が存在しない場合にポインタまたは参照メンバ変数は、所有者である場合(ハード)を決定します。

  • 決定する(困難)ポインタまたは参照型のメンバー変数は、明示的の所有権は、(例えば、等ウォークコンストラクタを介して)所有者であるかどうか述べられていない場合。

     

オリジナルリンク:

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c31-all-resources-acquired-by-a-class-must-be-released-by-the-classs-destructor

 


 

私はこの記事は参考になりましだと思いますか?ようこそ親指アップし、より多くの人と共有することができます。

より多くの更新の記事を読む、オブジェクト指向の考え方のマイクロチャンネル公衆数にしてください注意を払います[]

公開された408元の記事 ウォンの賞賛653 ビュー290 000 +

おすすめ

転載: blog.csdn.net/craftsman1970/article/details/104316408