这是我第一个使用boost::asio
的项目,我正在构建一个异步服务器。C++ boost :: asio如何在异步函数上正确使用std :: shared_ptr
我需要使用shared_ptr
来控制对session
控制指针的访问。这里是I'm做定义了会议,并把它传递给升压异步函数的方式:
// Define the new session object
std::shared_ptr<SocketSession> session = std::make_shared<SocketSession>(ioService);
// Configure the acceptor
acceptor.async_accept(session->getSessionSocket(),
boost::bind(&SocketServer::HandleAccept,
this,
session,
boost::asio::placeholders::error));
而且处理程序签名:
void SocketServer::HandleAccept(std::shared_ptr<SocketSession> session,
const boost::system::error_code& errorCode)
的代码在所有的编译罚款,没有错误。但是在运行代码时,调用HandleAccept
方法的错误为:Operation canceled
,甚至没有监听套接字。
它认为这与我使用shrared_ptr
的方式有关。我已经通过一些例子,并提高使用shared_from_this
。我无法找出为什么这是必要的,以及为什么我的shared_ptr
在运行时失败。
帮助赞赏。
注意:此代码在其他服务器类(Server
)上运行,而不在会话类(SocketSession
)上运行。在我看来,这导致不使用shared_from_this
作为SocketSession
正在创建另一个对象...
如果你没有,我建议在http://www.boost.org/doc/libs/1_59_0/doc/html/boost_asio/example/cpp11/echo/async_tcp_echo_serv检查'boost :: asio'服务器示例er.cpp –
我已经检查过了,但是增强文档并没有解释为什么它被使用的基本原理 - 它只是说明它是如何使用的。我的概念使用'std :: shared_ptr'看起来是正确的,但我不明白为什么它不能正常工作... – Mendes
@Mendez你是说boost示例不起作用?你是否说过你改变了boost示例的工作方式,它不再有效?如果是这样,你能突出显示你改变了什么吗?或者你是否说你产生了一种新的模式,而这种新模式不起作用?我只是想减少出错的难度。此外,一个最小的自包含编译示例将是有用的。请参阅https://stackoverflow.com/help/mcve – Yakk