C++ 为什么在这个boostssl服务器示例中使用shared_ptr
我正在检查这一点,想知道为什么要使用C++ 为什么在这个boostssl服务器示例中使用shared_ptr,c++,shared-ptr,C++,Shared Ptr,我正在检查这一点,想知道为什么要使用shared\u ptr。它从以下方法(do_accept())开始,并在会话类中持续使用auto self(shared_from_this()),以延长处理程序之间的使用寿命 Q:是否可以在session类中使用tcp::socket成员并避免shared\u ptr?必须进行哪些修改 void do_accept() { acceptor_.async_accept( [this](const boost::system::err
shared\u ptr
。它从以下方法(do_accept()
)开始,并在会话
类中持续使用auto self(shared_from_this())
,以延长处理程序之间的使用寿命
Q:是否可以在session
类中使用tcp::socket
成员并避免shared\u ptr
?必须进行哪些修改
void do_accept()
{
acceptor_.async_accept(
[this](const boost::system::error_code& error, tcp::socket socket)
{
if (!error)
{
std::make_shared<session>(std::move(socket), context_)->start();
}
do_accept();
}
);
}
如果
std::shared\u不属于std::shared\u ptr
“并持续使用…来延长其寿命”,则从\u this()
读取std::shared\u上的cppreference,这将导致运行时错误-似乎您已经意识到,您必须编写代码来管理会话的生存期,以确保在处理程序挂起时会话不会停止存在。从_this
对_shared _的每次调用都将替换为会话引用计数的某种增量,并且每次完成调度操作都必须将其递减。如果你搞砸了确保每一个增量在每一个可能的代码路径中都精确地导致一个减量,那么你的代码将崩溃或泄漏内存。讨厌。为什么你想用粗糙的解决方案来取代优雅的解决方案?@DavidSchwartz,非常感谢你的评论,我正在研究这个例子,我想知道的是更能实现共享\u ptr
概念的可能替代解决方案。我的想法是在server
类中使用session
数组,而不是在lambda例程(参数部分)中创建tcp::socket
,而是在session
构造函数中创建它。
void do_handshake()
{
auto self(shared_from_this());
socket_.async_handshake(boost::asio::ssl::stream_base::server,
[this, self](const boost::system::error_code& error)
{
if (!error)
{
do_read();
}
}
);
}