1 生命周期

  如果仅仅是临时变量,并没有调用new来在堆上创建空间,那么注意 : 生命周期仅在该作用域中,即声明该临时变量的{}中;

2 使用(librdkafka C++回调使用)

  在创建临时变量后,如果想使用该变量的指针,那么一定要注意其生命周期,当程序运行的时候出了这个作用域,此时该作用域栈销毁,哪怕该变量有值也不是准确的值,所以一定要注意好;

此处用最近写的一个code module来描述一下。

注意: 下面的event_cb 在整个代码使用中是一个错误示范:

//回调类::回调函数

class ExampleEventCb : public RdKafka::EventCb {
public:
void event_cb (RdKafka::Event &event) ;
}; RdKafka::Conf *conf = RdKafka::Conf::create(RdKafka::Conf::CONF_GLOBAL); void Init() { //初始化进行消费者的配置,创建,订阅主题 ExampleEventCb event_cb;     
   
if(RdKafka::Conf::CONF_OK!=conf->set("event_cb",&event_cb,errstr))
   { cout<<"\033conf err\033[0m ["<<__FILE__<<":"<<__LINE__<<"]"<<endl;
 }
    /.../
     consumer = RdKafka::KafkaConsumer::create(conf,errstr);
  if (!consumer)
{
std::cerr << "\033[31m Failed to create consumer: \033[0m" << errstr <<" "<< __FILE__<<":"<<__LINE__<<std::endl;
exit(1);
}    //delete tconf; 是否要删除,要考虑create是用的指针还是copy,因为是临时变量
     }
//等待Init执行完之后,再调用下方函数
void BeginConsume()
{
while (1) {
RdKafka::Message *msg = consumer->consume(1000);// 该函数会调用Init中设置的回调函数如event_cb;
msg_consume(msg, NULL);
delete msg;
}
}  

  

以上代码:由于consume会调用event_cb回调函数,所以

当event_cb为全局变量,或者生命周期不局限于Init的时候,程序才是正确的,否则会报段错误;’

由于librdkafka库函数的设计原则,在使用回调类的回调函数时:一定要注意回调类对象的生命周期;

3 指针+段错误:

  对于指针来说:如果一直使用该指针,则需要保证其在使用期间的生命周期。.
  段错误一般就是指针为NULL,访问NULL的数据,所以在报错的时候,看看有关联的变量指针或者函数指针的生命周期;

4 查看源码的建议:

  看源码后在写代码的时候,如果源码位置处出现了 ‘delete 指针‘ 或者 ‘销毁指针的函数’,那在编写类似代码的时候一定要注意该指针的生命周期;

eg:如上的conf变量,,,是否要删除,那你需要考虑创建 RdKafka::KafkaConsumer::create(conf,errstr)该函数内部实现使用的conf是其指针还是其copy的内容;避免调用一个已经delete的指针变量

  

C++临时变量的回顾思考以及librdkafka设置回调函数注意点的更多相关文章

  1. c++ 临时变量

    C++的临时变量 它们是被神所遗弃的孩子,没有人见过它们,更没有人知道它们的名字.它们命中注定徘徊于命运边缘高耸的悬崖和幽深的深渊之间,用自己短暂的生命抚平了生与死之间的缝隙.譬如朝露,却与阳光无缘. ...

  2. 重构手法之Replace Temp with Query(以查询取代临时变量)

    返回总目录 6.4Replace Temp with Query(以查询取代临时变量) 概要 你的程序以一个临时变量保存某一表达式的运算结果. 将这个表达式提炼到一个独立函数中.将这个临时变量的所有引 ...

  3. 《重构-改善既有代码的设计》学习笔记---Replace Temp with Query(以查询取代临时变量)

    临时变量的问题在于: 它们是暂时的,而且只能在所属函数内使用.由于临时变量只在所属函数内可见,所以,如果很多地方都在用这个临时变量,就会驱使你写出更长的函数.如果把临时变量替换为一个查询,那么其他函数 ...

  4. OpenCV-Python setMouseCallback回调函数中图像变量img的传递方法解析

    ☞ ░ 前往老猿Python博文目录 ░ 一.使用全局变量进行变量传递 OpenCV-Python中可以使用setMouseCallback来设置鼠标事件的回调函数,我们来看个样例. 1.1.案例1代 ...

  5. C++11引用临时变量的终极解析

    工作中遇到一个引用临时变量的问题,经过两天的学习,私以为:不仅弄明白了这个问题,还有些自己的独到见解. 这里使用一个简单的例子来把自己的学习过程和理解献给大家,如果有什么问题请不吝指正.   **** ...

  6. Linux设置环境变量小结:设置永久变量&临时变量 全局变量&局部变量

    1.总结背景 在linux系统下,如果你下载并安装了应用程序,很有可能在键入它的名称时出现“command not found”的提示内容.如果每次都到安装目标文件夹内,找到可执行文件来进行操作就太繁 ...

  7. python 临时变量使用心得

    在函数里面的临时变量也可以定义为一个函数名.变量名,这样就可以通过对象来访问这个变量了,函数使用完之后不会消除.因为函数也是对象,python里面一切皆为对象.

  8. 临时变量不能作为非const类型引用形参的实参

    摘要:     非const 引用形参只能与完全同类型的非const对象关联.      具体含义为:(1)不能用const类型的对象传递给非const引用形参:                  ( ...

  9. C++临时变量的生命周期

    C++ 中的临时变量指的是那些由编译器根据需要在栈上产生的,没有名字的变量.主要的用途主要有两类: 1) 函数的返回值, 如: string proc() { return string(" ...

随机推荐

  1. 算法与数据结构基础 - 哈希表(Hash Table)

    Hash Table基础 哈希表(Hash Table)是常用的数据结构,其运用哈希函数(hash function)实现映射,内部使用开放定址.拉链法等方式解决哈希冲突,使得读写时间复杂度平均为O( ...

  2. SQL和NoSQL的区别

    一.概念 SQL (Structured Query Language) 数据库,指关系型数据库.主要代表:SQL Server,Oracle,MySQL(开源),PostgreSQL(开源). No ...

  3. 为什么双重检查锁模式需要 volatile ?

    双重检查锁定(Double check locked)模式经常会出现在一些框架源码中,目的是为了延迟初始化变量.这个模式还可以用来创建单例.下面来看一个 Spring 中双重检查锁定的例子. 这个例子 ...

  4. (二十八)c#Winform自定义控件-文本框(一)

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...

  5. 记录一次基于docker搭建jira平台

    背景:项目需要选择不同测试平台,筛选一个最佳平台 现状:一台机器安装多套环境,虚拟机太繁琐 解决方案:通过Docker模拟安装测环境 1.pull docker 镜像: jira:7.11.1(目前的 ...

  6. Python模块——HashLib(摘要算法)与base64

    摘要算法(hashlib) Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度 ...

  7. 记录一次Jquery中 this 关键字使用出现的问题

    今天在用Jquery改造之前的JS代码过程中,遇到了一个让我懵逼了三小时的问题. 问题的关键在 this 的使用.在这里与大家分享一下.并且分享一下我做表单提交的检查代码 错误代码如下: $(&quo ...

  8. Nginx总结(三)基于端口的虚拟主机配置

    前面讲了如何配置基于IP的虚拟主机,大家可以去这里看看nginx系列文章:https://www.cnblogs.com/zhangweizhong/category/1529997.html 今天就 ...

  9. SparkSql学习笔记(包含IDEA编写的本地代码)

    Spark SQL and DataFrame 1.为什么要用Spark Sql 原来我们使用Hive,是将Hive Sql 转换成Map Reduce 然后提交到集群上去执行,大大简化了编写MapR ...

  10. 单选多选(CocosCreator)

    推荐阅读:  我的CSDN  我的博客园  QQ群:704621321 1.前沿       首先来说说我们的需求吧:随机出现单选题或者多选题,完全回答正确才算正确(多选题中少选错选算错),核实答案的 ...