gpt4 book ai didi

c++ - 亚信 : usage of self shared pointer in the examples

转载 作者:太空狗 更新时间:2023-10-29 20:10:47 31 4
gpt4 key购买 nike

查看 Asio 库的示例,this one for example (例如,第 37 行),我看到有时他们会从此创建一个共享指针(他们将其命名为 self),并将其捕获在调用一些 asio 函数的 lambda 中,但我不明白它的目的是什么.我什至没有看到它被使用过。

那么,他们为什么要这样做呢?


相关代码:

..在服务器类中...(创建 session 的地方)

if (!ec)
{
std::make_shared<session>(std::move(socket_))->start();
}

... session::start()成员方法:

void start()
{
do_read();
}

... session::do_read()成员方法(我感兴趣的地方):

void do_read()
{
auto self(shared_from_this()); // <<< ---WHY THIS??????
socket_.async_read_some(asio::buffer(data_, max_length),
[this, self](std::error_code ec, std::size_t length)
{
if (!ec)
{
do_write(length);
}
});
}

最佳答案

目的 std::enable_shared_from_this<> 是创建一个额外的std::shared_ptr来自 std::shared_ptr 拥有对象调用的句柄 shared_from_this 成员函数。


if (!ec)
{
std::make_shared<session>(std::move(socket_))->start();
}

上面的-^^^-就是line的地方创建一个 session .如您所见,std::shared_ptr std::make_shared 返回的将在 ; 销毁,这也应该破坏 session创建...

但是因为 start() 方法调用 do_read() 定义为...

void do_read()
{
auto self(shared_from_this());
socket_.async_read_some(asio::buffer(data_, max_length),
[this, self](std::error_code ec, std::size_t length)
{
if (!ec)
{
do_write(length);
}
});
}

那个self增加 shared_ptr引用计数。所以破坏了original shared_ptr created 不会销毁对象,相反,它会将 self 作为对已创建对象的引用。


还知道 Lambda 可以比其调用者活得更久... boost::asio::async_write是一个异步方法,在复制它的参数后立即返回。在您达到 session生命周期结束之前,传递的 lambda 可能不会执行。 .因此没有额外的 std::shared_ptr创建者 shared_from_this ,析构函数将运行。额外的 shared_ptr防止 session 的析构函数从运行开始,直到调用 lambda 函数并且它的参数被破坏。

关于c++ - 亚信 : usage of self shared pointer in the examples,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37036611/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com