shared_ptr
C スタイルのリソースでの使用
を使用boost::shared_ptr
すると、参照カウントがゼロになると自動的に呼び出される「deleter」に関数ポインタを渡すことができます。この機能により、shared_ptr を使用して、レガシー C API によって返されるリソースを管理できます。
レガシーをmy_src_create
そのまま残すことを検討し、次を返す新しい「ファクトリー」関数を提供しますshared_ptr
。
void my_src_deleter(my_src_type* raw_ptr)
{
my_src_destroy(raw_ptr);
}
typedef boost::shared_ptr<my_src_type> my_src_shared_ptr;
my_src_shared_ptr create_my_src(...)
{
my_src_type* raw_ptr;
my_src_create(&raw_ptr, ctx, topic, handle_src_event, NULL, NULL);
return my_src_shared_ptr(raw_ptr, &my_src_deleter);
}
std::map<string, my_src_shared_ptr> dict;
BOOST_FOREACH(std::string topic, all_topics)
{
dict[topic] = create_my_src(ctx, topic, handle_src_event, NULL, NULL);
}
クラスでレガシー C 構造体/関数をラップする
または、(jpalecek が提案したように)my_src
クラスにラップすることもできます。レガシーmy_src
オブジェクトの作成と破棄は、コンストラクタとデストラクタで処理されます。MySrc
これを行う場合は、クラスをコピー可能にするかどうかを検討する必要があります。が重い、または作成に費用がかかる場合MySrc
は、コピー不可にしてshared_ptr<MySrc>
、共有所有権がある場合は使用を検討することをお勧めしMySrc
ます。
class MySrc
{
public:
typedef boost::shared_ptr<MySrc> Ptr;
MySrc(...) { my_src_create(&src_, ...); }
~MySrc() { my_src_destroy(&src_); }
// Other member functions that uses my_src legacy functions
private:
my_src_type* src_;
// Make copy-constructor and assignment private to disallow copies
MySrc(const MySrc& rhs) {}
MySrc& operator=(const MySrc& rhs) {return *this;}
};
std::map<string, MySrc::Ptr> dict;
BOOST_FOREACH(std::string topic, all_topics)
{
dict[topic] = MySrc::Ptr(
new MySrc(ctx, topic, handle_src_event, NULL, NULL) );
}
MySrc
クラスを使用して、 my_src インスタンスで動作するレガシー関数をラップすることもできることに注意してください。
コピー可能にしたい場合はMySrc
、コピーコンストラクターと代入演算子を実装して、ディープコピーが実行されるようにしてください。