5

私はRAIIが何をするか知っています。コードが例外をスローするとき/場合に、メモリリークなどを防ぐことがすべてです。

さて、その賢い言葉の意味を理解したいと思います。 http://en.wikipedia.org/wiki/Acquisition

取得とは、何かを取得することです。

では、リソースの取得が初期化であると言うとき、それはどういう意味ですか?
私はここで用語の意味について話しているだけで、概念全般について話しているわけではありません。

4

2 に答える 2

9

以前に (おそらく Scott Meyers によって、私は覚えていません)、RAII は「破壊はリソースの解放」と呼ばれるべきである、またはその趣旨の言葉であると言われました。

「リソースの取得は初期化である」とは文字通り、オブジェクトが構築 (初期化) されるときに、何らかのリソース (メモリ割り当てやロックなど) を取得することを意味します。言い換えれば、デストラクタがリソースを解放するオブジェクトを初期化することによってのみ、リソースを取得する必要があることを示しています。

malloc()これは、特定の API が提供する手段 ( 、accept()、または など)によってリソースを取得し、対応する関数 ( 、、などpthread_mutex_lock()) を明示的に呼び出すことによってリソースを解放するC コーディング スタイルからの逸脱であるため、強調することが重要です。C++ には例外が存在するため、このアプローチはほとんど機能しません。C であっても、API を使用するたびに書き出さなければならない面倒なコードが発生し、すべてのユーザーは、リソースの使用が終了した後、制御が常にそのコードを通過することを確認する必要があります。free()close()pthread_mutex_unlock()

しかし、パターンの重要な部分は、オブジェクトが破棄されると、そのリソースが解放されるということです。オブジェクトを初期化することによってリソースを取得するか、初期化後にオブジェクトに対して別のことを行うことによってリソースを取得するかは、実際には問題ではありません。そして、RAIIオブジェクトによって管理されるリソースを生成する初期化以外の操作がある場合、人々はオブジェクトを「RAIIオブジェクト」と呼びます。

ですから、「RAII」の「取得は初期化です」についてはあまり心配しないでください。とにかく少し誤解を招くからです。

于 2012-06-13T12:48:05.367 に答える
0

取得は一般的な用語ですが、常に何らかのリソース (ファイル ハンドル、データベース接続、ミューテックスなど) を割り当てる操作を指します。具体的には、それを「所有」し、解放する必要があるコードに割り当てます。リソースのリークを避ける必要がない場合。

RAII の重要な概念は、リソースの有効期間が所有者オブジェクトの有効期間にバインドされていることです。これは、取得が初期化 (= オブジェクトの作成) と一致し、解放がその破棄 (保証されている) と一致するためです。

于 2012-06-13T12:52:40.887 に答える