3

Boost、またはその他のものには、共有ポインタのように機能するコンテナが含まれていますが、寿命の終わりに共有「リソース」に何が起こるかを制御できますか? ハンドアラウンドできるオブジェクトをカプセル化したいのですが、不要になったら、コンテキスト定義の方法で閉じることができます。

たとえば、スコープ外になるとファイルが自動的に閉じられることを知っているファイル ハンドルを作成して渡したいと思うかもしれませんが、ハンドルを削除したくありません。

私はそれを自分で実装することもできますが、フレームワークが既に存在する場合は、それには入りたくありません.誰かが間違いなくそれをうまくやった. boost::shared_ptrリソースは寿命が来ても削除されるべきではないため、少なくとも通常の形式では使用できません。

4

3 に答える 3

8

std::shared_ptrカスタム削除クラスを取ることができることを知っていますか? これは実際に「削除」または「解放」を使用する必要はありませんが、他の種類のメカニズム (参照カウントメカニズムなど) を簡単に使用できますrelease

これはあなたにとって非常に簡単な例です:

std::shared_ptr<FILE> foo(fopen("la", "r"), fclose);

shared_ptrデリータは、ラップするポインタ型を取る関数である必要があります。この場合、 whenfoo が範囲外にshared_ptrなると、ファイルが閉じられます。(注: エラー値がチェックされないため、これは完全に賢明な実装ではありません。これは単なる例です)。

于 2012-06-27T13:00:38.903 に答える
3

C++11 をサポートするコンパイラを使用している場合std::shared_ptr、コンストラクタの 1 つがカスタムの「deleter」関数を取ります。これにより、リソースを「解放」するための独自の関数を作成できます。

編集 - std::shared_ptr が実際には C++ への TR1 アップデートにあったことを忘れていたので、コンパイラが TR1 をサポートしている場合は、良好な状態になっているはずです。

于 2012-06-27T13:00:13.820 に答える
1

Boostまたはstd::shared_ptrは使用できないため、共有またはカスタムDeleterを持つ一意のスマートポインターを作成できます。

于 2012-06-27T13:41:32.657 に答える