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. python使用pip安装第三方库以及镜像使用豆瓣源安装第三方库

    2018/8/7  在使用pip安装pynum第三方库时的随笔 所有的前提都是你成功安装了pip 首先第一步 打开命令提示符  输入pip show pip 查看当前pip版本 然后可以上官网搜索一下 ...

  2. Storm初识(1)

    在Storm集群中,有两类节点:主节点 master node 和工作节点 worker nodes. 主节点运行着一个叫做Nimbus的守护进程.这个守护进程负责在集群中分发代码,为工作节点分配任务 ...

  3. struts与springmvc有何区别

    Struts2与SpringMVC有何区别? (1)SpringMVC的核心控制器是基于servlet技术,而Struts2是基于filter. (2)Struts2是类级别的拦截, 一个类对应一个r ...

  4. 使用DOM4J 对xml解析操作

    参考自:https://blog.csdn.net/redarmy_chen/article/details/12969219 dom4j是一个Java的XML API,类似于jdom,用来读写XML ...

  5. 入门MySQL——查询语法练习

    前言: 前面几篇文章为大家介绍了DML以及DDL语句的使用方法,本篇文章将主要讲述常用的查询语法.其实MySQL官网给出了多个示例数据库供大家实用查询,下面我们以最常用的员工示例数据库为准,详细介绍各 ...

  6. 使用文本框TextView/EditText的开源库清单

    在实际的开发中TextView和EditText是非常基本的控件.这两个控件的使用也是十分简单.而TextView/EditText的功能其实也是非常强大,例如简单的图文就可以使用TextView配合 ...

  7. Shrio使用Jwt达到前后端分离

    概述 前后端分离之后,因为HTTP本身是无状态的,Session就没法用了.项目采用jwt的方案后,请求的主要流程如下:用户登录成功之后,服务端会创建一个jwt的token(jwt的这个token中记 ...

  8. three.js基础前置知识

    这一节是纯理论知识,用于介绍three.js的入门概念,也就是开发前需要准备的理论基础. 一,三剑客 当然就是scene,camera,renderer这三个基本要素. scene是一个用于容纳三维空 ...

  9. ubuntu安装后的基本配置及常用软件的安装

    文章作者:foochane  原文链接:https://foochane.cn/article/2019061501.html 内容简介 当前Ubuntu版本:ubuntu 18.04,具体操作如下: ...

  10. Spring学习之旅(十四)--缓存

    数据库的读写并发一直都是应用性能的瓶颈所在之一,针对改动频率很小的数据我们应该将他存放到缓存中,减少与数据库的交互. 启用对缓存的支持 Spring 对缓存的支持有两种方式: 注解驱动的缓存 XML ...