在 C 样式资源上使用 shared_ptr
使用boost::shared_ptr,您可以将函数指针传递给“删除器”,当引用计数达到零时,该删除器将被自动调用。此功能允许使用 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 可复制,请确保实现复制构造函数和赋值运算符,以便执行深度复制。