C ++ boost :: asio如何在异步函数上正确使用std :: shared_ptr

时间:2015-12-01 14:52:00

标签: c++ asynchronous boost

这是我的第一个boost::asio项目,我正在构建一个异步服务器。

我需要使用shared_ptr来控制对session控件指针的访问。以下是我定义会话并将其传递给boost异步函数的方法:

// 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正在另一个对象上创建....

1 个答案:

答案 0 :(得分:2)

@Mendez当人们遇到这种“ASIO模式”的要求时,我有几个介绍性的样本。

你可以看看它们,因为我确实解释了这种模式及其引入的原因: