gpt4 book ai didi

c++ - std::bind 中的 shared_from_this 如何在对象不存在的情况下工作?

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

该代码安全吗?

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) 时,只有两个对该对象的引用之一已经消失,并且它仍然存在

关于c++ - std::bind 中的 shared_from_this 如何在对象不存在的情况下工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35468874/

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