gpt4 book ai didi

c++ - shared_from_this 和 this 的用例

转载 作者:搜寻专家 更新时间:2023-10-31 00:27:51 28 4
gpt4 key购买 nike

this source file有两个类:tcp_connectiontcp_server。在我看来,我已经选择了相关的代码位,但您可能想要引用完整的源代码以获取更多信息。

class tcp_connection : public boost::enable_shared_from_this<tcp_connection>
{
public:
typedef boost::shared_ptr<tcp_connection> pointer;

void start()
{
message_ = make_daytime_string();

boost::asio::async_write(socket_, boost::asio::buffer(message_),
boost::bind(&tcp_connection::handle_write, shared_from_this()));
}
};

class tcp_server
{
private:
void start_accept()
{
tcp_connection::pointer new_connection =
tcp_connection::create(acceptor_.get_io_service());

acceptor_.async_accept(new_connection->socket(),
boost::bind(&tcp_server::handle_accept, this, new_connection,
boost::asio::placeholders::error));
}
};

我的问题很简单:我们将如何使用 shared_from_this 作为 async_write 函数中的 bind 参数并使用 this 作为 中的 bind 参数async_accept函数?

最佳答案

共享指针管理动态分配对象的生命周期。每个持有的指针都会增加一个引用计数,当所有持有的指针都消失时,被引用的对象将被释放。

服务器

只有一台服务器,而且不是动态分配的。相反,该实例比接受器(可能还有 io_service)的生命周期更长,因此没有任何异步操作可以相信该对象能够存活足够长的时间。

连接

每个客户端生成一个新连接,动态分配 (make_shared) tcp_connection 实例,然后在其上启动异步操作。

服务器保留共享指针的拷贝,因此当连接上的所有异步操作完成时(例如,因为连接断开),tcp_connection 对象将被释放。

然而,因为当异步操作正在进行时对象必须被销毁,所以您需要将完成处理程序绑定(bind)到共享指针 (shared_from_this) 而不是 这个

关于c++ - shared_from_this 和 this 的用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47459959/

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