Asio:示例中自共享指针的使用
Asio: usage of self shared pointer in the examples
浏览 Asio 库的示例,例如这个(例如,第 37 行(,我看到有时他们从中创建一个共享指针(他们将其命名为 self(,并在 lambda 中捕获它,他们在其中调用一些 asio 函数,但我不明白它的目的是什么。我什至没有看到它被使用过。
那么,他们为什么要这样做呢?
相关代码:
..在服务器类中...(创建会话的位置(
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();
}
上面的 -^^^- 是创建session
的行。如您所见,std::make_shared
返回的std::shared_ptr
将在;
处被摧毁,这也应该破坏创建的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
引用计数。 因此,对原始shared_ptr
的销毁不会破坏对象,而是将 self 保留为对所创建对象的引用。
还要知道 Lambda 可以比其调用者活得更久...... boost::asio::async_write
是一种异步方法,在复制其参数后立即返回。传递的 lambda 可能不会在您到达session
生命周期结束之前执行。因此,如果没有 shared_from_this
创建的额外std::shared_ptr
,析构函数将运行。该附加shared_ptr
阻止session
析构函数运行,直到调用 lambda 函数并破坏其参数。
您引用的 lambda 正在从类对象捕获状态(例如 this 指针(,它们需要确保对象在访问状态时仍处于活动状态。请记住,这些 lambda 是异步调用的,例如,当有数据准备好读取时。因此,最初实例化类的函数和异步 lambda 都共享类实例的所有权。
你读过这个吗,如果没有,可能会有所帮助?
- 如何从具有移动语义的类对象中生成共享指针
- 使用共享指针的函数调用,其对象应为 const
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 如何访问由共享指针保存的类方法?
- 从矢量或地图中删除共享指针
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 使用共享指针实现复制 c'tor?
- C++/QT:使用指向私有成员的常量指针作为只读数据共享
- 共享指针继承,而不先显式强制转换
- 如何检查类中共享指针的有效性?
- 共享 C++ 的数据成员指针
- std::排序在共享指针的向量上
- 将相同共享指针的副本存储在不同的向量中是否是一种好的做法?
- 在什么情况下,需要共享智能指针而无法使用唯一指针?
- 嵌套类、继承和C++中的共享指针
- <Base> <Derived> 具有相同原始指针共享引用的 shared_ptr 和 shared_ptr 实例是否计数?
- 重载流<<运算符,用于指针/共享指针和其他类型的
- RAW指针共享_ptr
- 指针共享习语
- 将memmove函数与临时指针共享相同的地址