关于enable_shared_from_this的使用疑问

stecdeng stecdeng 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
今天遇到一段代码 使用方式比较不常见 个人不太理解
而且自以为可能有使用错误的可能 向各位请教
代码如下

template<class T>
class Socket : public std::enable_shared_from_this<T>
/*
这种使用enable_shared_from_this的方式正确么???
class Socket : public std::enable_shared_from_this<Socket> //T另外处理
*/
{
//.....
private:
tcp::socket _socket; //boost
MessageBuffer _readBuffer; // other class
public:
void ReadHandlerInternal(boost::system::error_code error, size_t transferredBytes)
{
if (error)
{
CloseSocket();
return;
}

_readBuffer.WriteCompleted(transferredBytes);
ReadHandler();
}
void AsyncReadWithCallback(void (T::*callback)(boost::system::error_code, std::size_t))
{
if (!IsOpen())
return;

_readBuffer.Normalize();
_readBuffer.EnsureFreeSpace();
_socket.async_read_some(boost::asio::buffer(_readBuffer.GetWritePointer(), _readBuffer.GetRemainingSpace()),
std::bind(callback, this->shared_from_this(), std::placeholders::_1, std::placeholders::_2));
/*
这里能够理解 传入的是T的成员函数 所以指针也是shared_from_this
*/
}
void AsyncRead()
{
if (!IsOpen())
return;

_readBuffer.Normalize();
_readBuffer.EnsureFreeSpace();
_socket.async_read_some(boost::asio::buffer(_readBuffer.GetWritePointer(), _readBuffer.GetRemainingSpace()),
std::bind(&Socket<T>::ReadHandlerInternal, this->shared_from_this(), std::placeholders::_1, std::placeholders::_2));
/*
这里为什么不是传入Socket的指针
*/
}

};
...全文

相关推荐

C++之enable_shared_from_this[代码]

本文详细介绍了C++中的std::enable_shared_from_this模板类,它允许被std::shared_ptr管理的对象安全地生成指向自身的std::shared_ptr,从而共享对象所有权。文章首先解释了为什么需要enable_shared_from_this,特别是在异步编程和事件处理中,它可以防止对象过早销毁和悬空指针问题。接着,文章通过示例代码展示了如何使用enable_shared_from_this,包括如何在异步操作中确保对象存活,以及如何使用weak_ptr来检测对象是否已被销毁。最后,文章总结了使用enable_shared_from_this的注意事项,如避免在构造函数和析构函数中使用shared_from_this,以及避免直接使用std::shared_ptr(this)以防止内存管理异常。

mac99

shared_from_this() in Constructor:直接替换std :: shared_ptr + std :: enable_shared_from_this-开源

显然,许多人不喜欢标准std :: enable_shared_from_this类不允许在构造函数中调用shared_from_this()。 猜猜是什么:应该填补这个空白。 boost库也可以这样做,但是它不允许在析构函数中创建shared_ptrs,并且它不提供release()方法来获取所包含指针的所有权。 但是,不利的一面是,它还没有成为线程安全的。

尽心致胜

详解C++中shared_ptr的使用教程

shared_ptr能够记录对象被引用的次数,主要被用来管理动态创建的对象的销毁,这里我们就来详解C++中shared_ptr的使用教程,需要的朋友可以参考下

weixin_38529293

设计模式一日一练-state

设计模式一日一练-state 设计模式一日一练-state

devilFredo

C++11 shared_ptr源码剖析[代码]

本文深入剖析了C++11中的shared_ptr智能指针及其配套函数make_shared的实现原理与使用场景。shared_ptr通过引用计数机制实现多个指针共享同一对象的所有权,自动管理内存释放以避免内存泄漏。文章详细解析了shared_ptr的构造函数、移动语义、拷贝语义以及常用成员函数,并对比了直接构造与make_shared创建方式的差异。make_shared在内存分配效率和异常安全性方面具有优势,但也存在构造函数访问限制和内存延迟释放的缺点。最后通过代码示例演示了shared_ptr的基本用法,包括引用计数变化和reset操作的影响。

代码浣熊
评论 15
收藏 已收藏
分享
返回顶部
stecdeng
其它技术问题 3,881 成员 9,044 内容