网络编程this 与shared——form——this

在使用 Boost.Asio 进行异步操作时,了解 this 和 shared_from_this() 的区别非常重要。以下是你使用 shared_from_this() 的原因,以及为什么直接使用 this 会导致问题。

1. this vs shared_from_this()

  • this:

    • this 是指向当前对象的指针,它只是一个普通的指针,没有任何智能指针的管理。它并不负责管理对象的生命周期。
    • 当异步操作进行时,如果当前对象(CSession 实例)在操作完成之前被删除了,使用 this 会导致未定义行为,因为指针将指向一个已经释放的内存区域。
  • shared_from_this():

    • shared_from_this() 是 C++11 标准中的 std::enable_shared_from_this 类的成员函数。这个函数返回一个 std::shared_ptr 指向当前对象。
    • 使用 shared_from_this() 确保该对象在异步操作进行时不会被销毁,因为 shared_ptr 会增加引用计数,从而保持对象在其引用存在期间不会被删除。

2. 为什么 shared_from_this() 是必须的

当你进行异步操作时,操作的处理可能在一段时间后才会完成,而在此期间,原始对象 this 可能会被删除。如果你直接使用 this,代码会在对象已经被销毁后尝试访问它,导致程序崩溃。

_socket.async_read_some(
    boost::asio::buffer(_data, MAX_LENGTH), 
    std::bind(&CSession::HandleRead, this,
               std::placeholders::_1, std::placeholders::_2, 
               shared_from_this())); // 这里是安全的

3. 实现 shared_from_this

为了能够使用 shared_from_this(),你的类 CSession 需要从 std::enable_shared_from_this<CSession> 继承。这允许对象通过 std::shared_ptr 进行构造,并在内部管理其自身的生命周期。

class CSession : public std::enable_shared_from_this<CSession> {
    // ...
};

总结

  • 使用 shared_from_this() 来确保在异步操作期间对象的生命周期得到正确管理,是避免悬挂指针和未定义行为的有效方法。
  • 直接使用 this 可能会导致在对象已被销毁的情况下继续使用该指针,从而导致崩溃或数据破坏。

如果你已经在 CSession 类中继承了 std::enable_shared_from_this,那么你可以安全地使用 shared_from_this() 来传递该对象到异步操作的回调函数中。这样就确保了在整个异步操作过程中对象都是有效的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值