我经常在代码中看到这种模式,绑定shared_from_this为成员函数的第一个参数,并使用async_*函数调度结果.以下是另一个问题的示例:
void Connection::Receive()
{
boost::asio::async_read(socket_,boost::asio::buffer(this->read_buffer_),
boost::bind(&Connection::handle_Receive,
shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
Run Code Online (Sandbox Code Playgroud)
使用shared_from_this()而不是使用的唯一原因this是在调用成员函数之前保持对象存活.但除非在某处有某种类型的增强魔法,因为this指针是类型的Connection*,所有都handle_Receive可以,并且返回的智能指针应该立即转换为常规指针.如果发生这种情况,那么没有任何东西可以让对象保持活力.当然,在呼叫中没有指针shared_from_this.
但是,我经常看到这种模式,我不敢相信它在我看来完全被打破了.当操作完成时,是否有一些Boost魔法会导致shared_ptr转换为常规指针?如果是这样,这是在某处记录的吗?
特别是,在某个地方记录共享指针将保持存在直到操作完成?调用get_pointer强指针然后在返回的指针上调用成员函数是不够的,除非强指针在成员函数返回之前不被销毁.
boost::asio的各种read和write函数和方法接受boost::asio::buffer.根据buffer的文档,std::string不能包含mutable boost::asio::buffer,因此不能用于asio的read函数.这可能是由于这样的事实,std::string不允许其内部缓冲区可变访问(这是以前讨论这里).
这是一种耻辱,因为它std::string是在C++中表示可变数据缓冲区的便捷方式.没有它,我们要么留下POD阵列,boost::array和std::vector<char>.前两个对于可变长度消息不方便.std::vector<char>可以工作,但这是一种不自然的方式携带数据缓冲区(*)
问题:
std::string与boost::asio读取缓冲区?我在这里错过了什么吗?std::vector<char> 是在一个可变的缓冲支持.是因为它保证其内部缓冲区在内存中是连续的,并且允许对它进行可变访问&vec[0]吗?提前致谢
(*) 恕我直言.protobuf例如,查看序列化 - 它提供序列化,std::string但不提供std::vector<char>,至少不明确.
编辑:vector<char>毕竟我最终使用了.protobuf允许vector<char>通过SerializeToArray带有指针的调用(&vec[0]可以在那里传递)进行序列化.
当我尝试使用带有boost :: asio :: buffer的std :: string时,我收到以下错误消息:
boost/asio/detail/consume_buffers.hpp:在构造函数'boost :: asio :: detail :: consume_buffers <boost :: asio :: mutable_buffer,boost :: asio :: const_buffers_1
:: consume_buffers(const boost :: asio :: const_buffers_1&)':boost/asio/impl/read.hpp:140:25:
从'boost :: asio :: detail :: read_op <boost :: asio ::实例化basic_stream_socket,boost :: asio :: const_buffers_1,boost :: asio :: detail :: transfer_all_t,boost :: _ bi :: bind_t <void,boost :: _ mfi :: mf1,boost :: _ bi :: list2,boost :: arg <1>(*)()>:: read_op(boost :: asio :: basic_stream_socket&,const boost :: asio :: …