使用shared_ptr
C 风格的资源
使用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
可复制,请确保实现复制构造函数和赋值运算符,以便执行深度复制。