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();
            }
        }
    );
}