【发布时间】:2016-05-29 21:01:05
【问题描述】:
该代码安全吗?
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 操作可能需要很长时间。
在点 (1) 只有一个 shared_ptr 指向 C 对象。 start() 被调用,start() 完成并且在 (2) 变量 cptr 超出范围并被销毁。
当async_write完成写操作后,回调被调用;这会导致崩溃,因为shared_from_this() 尝试将shared_ptr 设置为不存在的对象。
对将要发生的事情的描述是否正确?
【问题讨论】:
标签: c++ c++11 boost-asio bind shared-ptr