C++临时变量的回顾思考以及librdkafka设置回调函数注意点
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设置回调函数注意点的更多相关文章
- c++ 临时变量
C++的临时变量 它们是被神所遗弃的孩子,没有人见过它们,更没有人知道它们的名字.它们命中注定徘徊于命运边缘高耸的悬崖和幽深的深渊之间,用自己短暂的生命抚平了生与死之间的缝隙.譬如朝露,却与阳光无缘. ...
- 重构手法之Replace Temp with Query(以查询取代临时变量)
返回总目录 6.4Replace Temp with Query(以查询取代临时变量) 概要 你的程序以一个临时变量保存某一表达式的运算结果. 将这个表达式提炼到一个独立函数中.将这个临时变量的所有引 ...
- 《重构-改善既有代码的设计》学习笔记---Replace Temp with Query(以查询取代临时变量)
临时变量的问题在于: 它们是暂时的,而且只能在所属函数内使用.由于临时变量只在所属函数内可见,所以,如果很多地方都在用这个临时变量,就会驱使你写出更长的函数.如果把临时变量替换为一个查询,那么其他函数 ...
- OpenCV-Python setMouseCallback回调函数中图像变量img的传递方法解析
☞ ░ 前往老猿Python博文目录 ░ 一.使用全局变量进行变量传递 OpenCV-Python中可以使用setMouseCallback来设置鼠标事件的回调函数,我们来看个样例. 1.1.案例1代 ...
- C++11引用临时变量的终极解析
工作中遇到一个引用临时变量的问题,经过两天的学习,私以为:不仅弄明白了这个问题,还有些自己的独到见解. 这里使用一个简单的例子来把自己的学习过程和理解献给大家,如果有什么问题请不吝指正. **** ...
- Linux设置环境变量小结:设置永久变量&临时变量 全局变量&局部变量
1.总结背景 在linux系统下,如果你下载并安装了应用程序,很有可能在键入它的名称时出现“command not found”的提示内容.如果每次都到安装目标文件夹内,找到可执行文件来进行操作就太繁 ...
- python 临时变量使用心得
在函数里面的临时变量也可以定义为一个函数名.变量名,这样就可以通过对象来访问这个变量了,函数使用完之后不会消除.因为函数也是对象,python里面一切皆为对象.
- 临时变量不能作为非const类型引用形参的实参
摘要: 非const 引用形参只能与完全同类型的非const对象关联. 具体含义为:(1)不能用const类型的对象传递给非const引用形参: ( ...
- C++临时变量的生命周期
C++ 中的临时变量指的是那些由编译器根据需要在栈上产生的,没有名字的变量.主要的用途主要有两类: 1) 函数的返回值, 如: string proc() { return string(" ...
随机推荐
- 进军pc市场 华为剑走偏锋可有戏?
尽管官方并未正式公布,但在前段时间,华为将要进军PC市场的消息在业内传得沸沸扬扬,据知情人士曝料,其第一款个人电脑将在今年4月上线.而华为将进军PC市场的消息,对其他智能手机厂商来说又意味着什么呢? ...
- SoapSerialization——手机号码归属地
public class MainActivity extends AppCompatActivity { private EditText etNumber; private TextView tv ...
- RocketMQ中PullConsumer的消息拉取源码分析
在PullConsumer中,有关消息的拉取RocketMQ提供了很多API,但总的来说分为两种,同步消息拉取和异步消息拉取 同步消息拉取以同步方式拉取消息都是通过DefaultMQPullConsu ...
- Java8 CompletableFuture 编程
一.简介 所谓异步调用其实就是实现一个无需等待被调用函数的返回值而让操作继续运行的方法.在 Java 语言中,简单的讲就是另启一个线程来完成调用中的部分计算,使调用继续运行或返回,而不需要等待计算结 ...
- nodeCZBK-笔记2
目录 day04 mongoDB数据库使用 day05 node使用mongoDB数据库 day04 mongoDB数据库使用 电脑全局安装数据库 开机命令:mongod --dbpath c:\mo ...
- Windows Server 2008在网络环境配置打印机
下面学习在Windows Server2008在网络环境搭建打印机服务器,打印机服务器也是很常用的,特别是在中大型企业里面,打印机数量比较多为方便管理,可以搭建一个打印机服务,这里介绍一下,本地打印机 ...
- 初学html总结
2019-08-17 17:58:49 html:超文本标记语言,用于网页结构的搭建 html语言构成:由标签.属性.属性值构成 标签:" < "后面第一个单词 属性:标签后 ...
- 数据读写API——IO流
理清一些概念 1.Java 中的IO是干啥的? IO指的是Input和Output,主要目的是实现数据在存储介质之间的传输.[流:数据流,类比与水流的流动] 2.IO分类 按照操作单元来划分,可以分为 ...
- springboot 整合shiro
参考: https://blog.csdn.net/fuweilian1/article/details/80309192(推荐) https://blog.csdn.net ...
- Oracle数据库之四 简单查询
四.简单查询 简单查询的主要特征就是将一张数据表之中的全部数据行进行显示,而后可以利用 SELECT 子句来控制所需要的输出列. 4.1.基础语法 范例:查询 emp 表中的数据(全部数据查询) ...