在对象不存在的情况下,std::bind 中的shared_from_this如何工作
How does shared_from_this in std::bind work where object does not exist?
该代码安全吗?
class C : public std::enable_shared_from_this<C> {
void start() {
boost::asio::async_write(socket_, boost::asio::buffer(message_),
std::bind(&tcp_connection::handle_write, shared_from_this(),
_1, _2));
};
// ...
};
class D {
void start()
{
std::shared_ptr<C> cptr = std::make_shared<C>(); // (1)
cptr->start();
} // (2)
};
如果消息很长,则async_write
操作可能需要很长时间。
只有一个shared_ptr
指向点 (1( 处的C
对象。 调用start()
,start()
完成,在 (2( 变量cptr
超出范围并被销毁。
当async_write
完成写入操作时,将调用回调;这会导致崩溃,因为shared_from_this()
尝试对不存在的对象进行shared_ptr
。
这种对会发生什么的描述是否正确?
不,你说得不对。
对shared_from_this()
的调用发生在start
返回之前。结果shared_ptr
的副本由 bind
的结果保存。
因此,当您到达 (2( 时,对该对象的两个引用中只有一个消失了,并且它仍然处于活动状态
相关文章:
- 表示"accepting anything for this template argument" C++概念的通配符
- 为什么使用 "this" 指针调用派生成员函数?
- 如何解决"invalid conversion from 'char' to 'const char*'"
- C++错误:"error: int aaa::bbb is protected within this context"
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 关于C++中具有多重继承"this"指针的说明
- 在noexcept 规范中是否允许使用"this"?
- 如何修复"error: ‘_1’ was not declared in this scope"?
- C++调用具有 *this 属性的单个帮助程序函数
- Doees the 'this' 指针参与虚函数的多态行为
- 在 c++ 中正确定义"this"关键字?
- 在什么情况下,两个堆栈分配的结构对象的 this 点指向同一个地址?
- "Unable to start debugging. No process is associated with this object." - 在Visual Studio Code中使用GDB
- std::async from std::async in windows xp
- QObject::连接无法将信号连接到*this*对象的插槽
- 析构函数中的"delete this"
- 为什么成员函数内的"this"指针为空?
- 为什么我需要在转换构造函数上引用 this->?
- G++ 编译错误"... is protected from within this context"而 clang 没有错误