IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【c++】std::bind的使用方法深一层理解 -> 正文阅读

[C++知识库]【c++】std::bind的使用方法深一层理解

之前对std::bind使用时,往往在类CA中std::bind(&CA::func, this),其中的func是类CA的一个成员函数,后面带入的this往往是无脑的写入其中。

muduo中TcpClient析构函数源码如下:
?

TcpClient::~TcpClient()
{
  LOG_INFO << "TcpClient::~TcpClient[" << name_
           << "] - connector " << get_pointer(connector_);
  TcpConnectionPtr conn;
  bool unique = false;
  {
    MutexLockGuard lock(mutex_);
    unique = connection_.unique();
    conn = connection_;
  }
  if (conn)
  {
    assert(loop_ == conn->getLoop());
    // FIXME: not 100% safe, if we are in different thread
    CloseCallback cb = std::bind(&detail::removeConnection, loop_, _1);
    loop_->runInLoop(
        std::bind(&TcpConnection::setCloseCallback, conn, cb));
    if (unique)
    {
      conn->forceClose();
    }
  }
  else
  {
    connector_->stop();
    // FIXME: HACK
    loop_->runAfter(1, std::bind(&detail::removeConnector, connector_));
  }
}

今天在看muduo的TcpClient::~TcpClient类时,发现CloseCallback cb = std::bind(&detail::removeConnection, loop_, _1);并没有将类自身的指针传入std::bind中,而是将外面一个对象(EventLoop类)的函数及指针传入其中。
这样作者就很好的避免了,对象析构之后,外面某个调用还来操作析构对象原来操作的内存,导致因为操作非法内存系统崩溃。

进一步思考:为什么TcpClient的TcpConnection没有作为成员变量,生命周期随着TcpClient的生命周期而生死。其中析构函数的loop_->runInLoop(std::bind(&TcpConnection::setCloseCallback, conn, cb));这一句可以说明问题。TcpClient析构之后,TcpConnection还有后续的处理。

(1)对于类的成员函数来讲,需要采用std::bind(&类名::函数名,?类对象的指针,函数参数列表)的方式指定具体的函数对象;如,上述loop_->runInLoop(std::bind(&TcpConnection::setCloseCallback, conn, cb));
(2)对于非类的成员函数来讲,只需要采用std::bind(&函数名, 函数参数列表)的方式即可;如:上述CloseCallback cb = std::bind(&detail::removeConnection, loop_, _1);。//? 此处的detail为namespace

由此想到之前无脑写入this,没有考虑对象析构之后的相关处理。因此在函数对象要考虑一下执行该函数对象时,对象是否还有效。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章           查看所有文章
加:2022-04-04 11:50:13  更:2022-04-04 11:57:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:39:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码