Boost ライブラリのスマート ポインタを使用してオブジェクトの有効期間を管理する方法と同様の質問があります。しかし、私の場合、「オブジェクト」は C++ オブジェクトではなく、C API から返された/渡された不透明な型です。型にはポインターのセマンティクスがありません。つまり、逆参照はありません。ただし、C API の他の関数に引数として渡されます。この型には、close内部リソースをクリーンアップするために呼び出す必要がある決定的な API もあります。
だから、私は次のようなC APIを持っています
opaque_legacy_type_t x;
XXopen(..., &x); // allocates/opens resource and fills out 'x' to be used later
XXdoSomethingWithResource(x, ...); // do something with resources related to 'x'
...more actions...
XXclose(x); // closes and cleans up resources related to 'x'
さまざまな理由から、私の C++ コードでは、opaque_legacy_type_t の「インスタンス」を、ヒープに割り当てられたオブジェクト インスタンスを管理するのと同じように管理したいと考えていますboost::shared_ptr<>。これshared_ptrを行うことで呼び出しを管理できるほど十分に提供さXXcloseれているようです:
opaque_legacy_type_t x;
XXopen(..., &x);
boost::shared_ptr<opaque_legacy_type_t> managed(x, XXclose);
しかし、 にopaque_legacy_type_tはポインターのセマンティクスがないため、 の使用法managedは少しぎこちないです。
私がやりたいのは、managed_typeに似たのようなものを持ちshared_ptr、すべてを書く必要のないアイデアを探しています。
編集: 例の元の失敗を修正しました。従来の API は、不透明型をポインターではなく値で受け取ります。