/// <summary> /// Handle reads the data with error code. /// </summary> /// <param name="e">The error code.</param> /// <param name="bytes_transferred">The bytes_transferred.</param> void TcpConnection::handle_read(const boost::system::error_code& e, std::size_t bytes_transferred) { if (!e) { if(bytes_transferred > 0) { receiveMsgbuffer_.append(readBuffer_.data(),bytes_transferred); boost::posix_time::ptime receiveTime = boost::posix_time::microsec_clock::universal_time(); bool receAgain = true; if (messageCallBack_) { receAgain = messageCallBack_(shared_from_this(),boost::ref(receiveMsgbuffer_),receiveTime); } if ( receAgain && socket_.is_open()) { socket_.async_read_some(boost::asio::buffer(readBuffer_), boost::bind(&TcpConnection::handle_read, shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); } boost::weak_ptr<WheelEntry<TcpConnection> > weak_ptr(boost::any_cast<boost::weak_ptr<WheelEntry<TcpConnection> > >(any_)); if(p_timing_wheel_) { p_timing_wheel_->Active(weak_ptr); } } } else { // TODO if (errorCallBack_) { errorCallBack_(shared_from_this(),e); } Stop(); } }
/// Handle a diconnect on the underlying connection. void disconnected_handler() { if (connection_->connected()) { connection_->set_connected(false); if (disconnected_handler_) disconnected_handler_(); connection_->close(); } // attempt to reconnect in period_ miliseconds if (period_ > 0) { timer_.expires_from_now(boost::posix_time::milliseconds(period_)); weak_pointer weak_ptr(weak_from_this()); timer_.async_wait([weak_ptr](boost::system::error_code const& error) { timeout_handler(weak_ptr, error); }); } }
// 如果只有pointer,那么生成的shared_ptr与pointer指向同一处资源; // 如果是pointer和deleter:那么在shared_ptr指向的资源引用计数为0的时候,shared_ptr析构函数调用deleter;常用于释放文件,连接等资源 // 如果是pointer,delter,allocator,那么,除了析构调用deleter以外,在创建的时候,会调用allocator分配资源 // 5. shared_ptr使用注意事项: // (1)“不要普通指针和智能指针混用”,这句话是指的“普通指针”是指向动态申请的资源(比如堆中申请的内存)的指针。对于局部变量,或者静态变量,当使用普通指针初始化智能指针的时候,会出现delete局部变量的错误 // (2)使用make_shared()函数替代new来分配动态内存,可以很大程度上避免普通指针再次指向该内存空间(因为如果要拷贝该指针,必须是shared_ptr对象) // (3)格外注意普通指针和智能指针存在转换的函数:1.普通指针转智能指针shared_ptr构造函数std::shared_ptr<T>(U*p),2.智能指针转普通指针shared_ptr.get() //如何使用weak_ptr // 1.why weak_ptr? 为什么我们需要weak_ptr // weak_ptr是shared_ptr循环引用问题的一个“补丁”,在可以预见的循环引用的问题上,使用weak_ptr。(当然,一般出现循环引用,优先从设计结构上去解决) // 2. what is weak_ptr? 什么是weak_ptr? // weak 和 strong 相对:strong是指,该指针会改变对象的引用计数,且会负责检查和释放资源;weak 是指,该指针不会改变引用计数,且不控制资源的释放 // 所以:weak_ptr是一种不控制所指向对象生存期的智能指针,它指向一个shared_ptr管理的对象。weak_ptr不改变引用计数,shared_ptr释放资源时不考虑weak_ptr的绑定. // 从上面可以看出,weak_ptr是一种依赖于shared_ptr的类型,所以,可以推测,其只能用shared_ptr和weak_ptr来初始化 // // 3. How to use weak_ptr? 如何使用weak_ptr? // (1)初始化 weak_ptr(T) wp(sp);//使用shared_ptr初始化 weak_ptr(T) wp = w;//使用weak_ptr初始化 // (2)获取weak_ptr绑定对象的shared_ptr weak_ptr.lock(); //由于weak_ptr的弱引用特点,资源释放时,不会考虑weak_ptr,所以,在通过weak_ptr获取对象的sheared_ptr时,需要调用lock()函数,该函数会校验weak_ptr指向的对象是否存在,如果存在,则返回一个指向共享对象的shared_ptr,如果不存在,返回一个empty shared_ptr if(shared_ptr<int> np = wp.lock()){ //如果wp指向的对象没有被释放,则np不为空,np指向wp绑定的对象 }
int main() { shared_ptr(); shared_ptr_container(); weak_ptr(); make_shared(); }