Exemple #1
0
	/// <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();
		}
	}
Exemple #2
0
    /// 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); });
      }
    }
Exemple #3
0
// 	如果只有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();
}