std::shared_ptr存在的问题
关于std::shared_ptr存在的问题,可以参考这篇文章:muduo网络库——enable_shared_from_this和弱回调_却道天凉_好个秋的博客-优快云博客
WeakCallback
用std::weak_ptr保存一个对象object,std::function保存一个不定参数的函数对象function,并重载函数调用运算符operator(),用于安全地将object作为function的参数来调用。
template<typename CLASS, typename... ARGS>
class WeakCallback
{
public:
WeakCallback(const std::weak_ptr<CLASS>& object,
const std::function<void (CLASS*, ARGS...)>& function)
: object_(object), function_(function)
{
}
// Default dtor, copy ctor and assignment are okay
void operator()(ARGS&&... args) const
{
std::shared_ptr<CLASS> ptr(object_.lock());
if (ptr)
{
function_(ptr.get(), std::forward<ARGS>(args)...);
}
// else
// {
// LOG_TRACE << "expired";
// }
}
private:
std::weak_ptr<CLASS> object_;
std::function<void (CLASS*, ARGS...)> function_;
};
template<typename CLASS, typename... ARGS>
WeakCallback<CLASS, ARGS...> makeWeakCallback(const std::shared_ptr<CLASS>& object,
void (CLASS::*function)(ARGS...))
{
return WeakCallback<CLASS, ARGS...>(object, function);
}
template<typename CLASS, typename... ARGS>
WeakCallback<CLASS, ARGS...> makeWeakCallback(const std::shared_ptr<CLASS>& object,
void (CLASS::*function)(ARGS...) const)
{
return WeakCallback<CLASS, ARGS...>(object, function);
}
注意:
1)std::shared_ptr<CLASS> ptr(object_.lock()); lock为std::weak_pt的成员函数,通过调用lock()函数,可以将弱引用指针std::weak_ptr提升为std::shared_ptr,再通过非空判断来确定当前智能指针执行的对象是否存在,如果不为空,则执行相应回调;
2)const std::weak_ptr<CLASS>& object 保证安全的使用传入的实参;
使用
loop_->runAfter(retryDelayMs_/1000.0,
std::bind(&Connector::startInLoop, shared_from_this()));
这样可以安全的调用shared_from_this()->startInLoop(),并不用关心Connector类先析构带来的异常。