C语言中临时变量回顾与librdkafka回调函数设置注意事项,有哪些关键点需要注意?

2026-04-16 21:122阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计809个文字,预计阅读时间需要4分钟。

C语言中临时变量回顾与librdkafka回调函数设置注意事项,有哪些关键点需要注意?

1+ 生命周期仅与临时变量相关,如果仅是临时变量,则无需使用new在堆上创建空间;注意:生命周期仅在作用域内,即明确指出该临时变量的生命周期,例如:{int temp=10; // temp的生命周期仅在{}内}

2+ 使用(librdkafka+C++回调)在创建临时变量时回调使用

1 生命周期

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

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

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

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

C语言中临时变量回顾与librdkafka回调函数设置注意事项,有哪些关键点需要注意?

注意: 下面的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的指针变量

本文共计809个文字,预计阅读时间需要4分钟。

C语言中临时变量回顾与librdkafka回调函数设置注意事项,有哪些关键点需要注意?

1+ 生命周期仅与临时变量相关,如果仅是临时变量,则无需使用new在堆上创建空间;注意:生命周期仅在作用域内,即明确指出该临时变量的生命周期,例如:{int temp=10; // temp的生命周期仅在{}内}

2+ 使用(librdkafka+C++回调)在创建临时变量时回调使用

1 生命周期

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

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

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

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

C语言中临时变量回顾与librdkafka回调函数设置注意事项,有哪些关键点需要注意?

注意: 下面的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的指针变量