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. LongAdder和AtomicLong性能对比

    jdk1.8中新原子操作封装类LongAdder和jdk1.5的AtomicLong和synchronized的性能对比,直接上代码: package com.itbac.cas; import ja ...

  2. (转载)js数组中的find、filter、forEach、map四个方法的详解和应用实例

    数组中的find.filter.forEach.map四个语法很相近,为了方便记忆,真正的掌握它们的用法,所以就把它们总结在一起喽. find():返回通过测试的数组的第一个元素的值 在第一次调用 c ...

  3. Linux基础文件类型

    一.文件时间 ls -l 文件名 仅看的是文件的修改时间 [root@linux ~]# ls -l /etc/passwd -rw-r--r-- root root 5月 : /etc/passwd ...

  4. Two types of people with high scores of English exams

    I believe that there are two types of people who get high scores in English exams: 1) have high inte ...

  5. Ubuntu 18.04 LTS版本 GoldenDict安装与配置

    为何安装? GoldenDict是一款Linux下很好用的词典软件,其具有的关于词典的裁剪功能使得用户能够方便地对各种词典进行添加或删除,其具有的屏幕取词功能能够帮助用户方便地进行翻译,其具有的网络源 ...

  6. [转载]windows下mongodb安装与使用整理

    windows下mongodb安装与使用整理 一.首先安装mongodb 1.下载地址:http://www.mongodb.org/downloads 2.解压缩到自己想要安装的目录,比如d:\mo ...

  7. 02、安装Linux系统

    1.我们打开VM软件,然后点击“创建新的虚拟机”,选择“经典”选项 2.选中“稍后安装操作系统”单选按钮,然后单击“下一步”按钮 3.将客户机操作系统的类型选择为“Linux”,版本为"Re ...

  8. 重读《学习JavaScript数据结构与算法-第三版》- 第3章 数组(一)

    定场诗 大将生来胆气豪,腰横秋水雁翎刀. 风吹鼍鼓山河动,电闪旌旗日月高. 天上麒麟原有种,穴中蝼蚁岂能逃. 太平待诏归来日,朕与先生解战袍. 此处应该有掌声... 前言 读<学习JavaScr ...

  9. Oracle 12cR1 RAC集群安装(一)--环境准备

    基本环境 操作系统版本 RedHat6.7 数据库版本 12.1.0.2 数据库名称 testdb 数据库实例 testdb1.testdb2 (一)安装服务器硬件要求 配置项目 参数要求 网卡 每台 ...

  10. DC6-靶机渗透

    靶场下载链接: Download: http://www.five86.com/downloads/DC-6.zip Download (Mirror): https://download.vulnh ...