HALCON 控制变量没有被初始化_C++全局变量初始化

c++ 全局变量初始化的一点总结

对于C语言的全局和静态变量,不管是否被初始化,其内存空间都是全局的;如果初始化,那么初始化发生在任何代码执行之前,属于编译期初始化。由于内置变量无须资源释放操作,仅需要回收内存空间,因此程序结束后全局内存空间被一起回收,不存在变量依赖问题,没有任何代码会再被执行!

C++引入了对象,这给全局变量的管理带领新的麻烦。C++的对象必须有构造函数生成,并最终执行析构操作。由于构造和析构并非分配内存那么简单,可以说相当复杂,因此何时执行全局或静态对象(C++)的构造和析构呢?这需要执行相关代码,无法在编译期完成,因此C++标准规定:全局或静态对象当且仅当对象首次用到时才进行构造,并通过atexit()来管理对象的生命期,在程序结束之后(如调用exit,main),按FILO顺序调用相应的析构操作!

全局变量、文件域的静态变量和类的静态成员变量在main执行之前的静态初始化过程中分配内存并初始化;局部静态变量(一般为函数内的静态变量)在第一次使用时分配内存并初始化。这里的变量包含内置数据类型和自定义类型的对象。

函数内的静态对象,初始化是在第一次运行到那里的时候才初始化的。假设有一个函数testFun,大约是下面这样

void testFun()
{
static std::string str("Test string");
}

那么函数里面那个str,要第一次运行testFun的时候才会被初始化。

初始化的顺序

对于出现在同一个编译单元内的全局变量来说,它们初始化的顺序与他们声明的顺序是一致的(销毁的顺序则反过来),而对于不同编译单元间的全局变量,c++ 标准并没有明确规定它们之间的初始化(销毁)顺序应该怎样,因此实现上完全由编译器自己决定,一个比较普遍的认识是:不同编译单元间的全局变量的初始化顺序是不固定的,哪怕对同一个编译器,同一份代码来说,任意两次编译的结果都有可能不一样[1]。

因此,一个很自然的问题就是,如果不同编译单元间的全局变量相互引用了怎么办?

当然,最好的解决方法是尽可能的避免这种情况.

几个技巧

好吧,我承认总有那么一些特殊的情况,是需要我们来处理这种在全局变量的初始化函数里竟然引用了别的地方的全局变量的情况,比如说在全局变量的初始化函数里调用了 cout, cerr 等(假设是用来打 log, 注意 cout 是标准库里定义的一个全局变量)[2],那么标准库是怎样保证 cout 在被使用前就被初始化了呢? 有如下几个技巧可以介绍一下。

Construct On First Use

该做法是把对全局变量的引用改为函数调用,然后把全局变量改为函数内的静态变量:

int get_global_x()
{
   static X x;
   return x.Value();
}

这个方法可以解决全局变量未初始化就被引用的问题,但还有另一个对称的问题它却没法解决,函数内的静态变量也属于 variables with static storage, 它们析构的顺序在不同的编译单元间也是不确定的,因此上面的方法虽然必然能保证 x 的初始化先于其被使用,但却没法妥善处理,如果 x 析构了 get_global_x() 还被调用这种可能发生的情况。

一个改进的做法是把静态变量改为如下的静态指针:

int get_global_x()
{
   static X* x = new X;
   return x->Value();
}

这个改进可以解决前面提到的 x 析构后被调用的问题,但同时却也引入了另一个问题: x 永远都不会析构了,内存泄漏还算小问题或者说不算问题,但如果 x 的析构函数还有事情要做,如写文件清理垃圾什么的,此时如果对象不析构,显然程序的正确性都无法保证.

这个问题在 gcc c++ 的标准库里也没有得到解决,有兴趣的可以看看这个讨论。

--more

Storage duration

All objects in a program have one of the following storage durations:

  • automatic storage duration. The storage for the object is allocated at the beginning of the enclosing code block and deallocated at the end. All local objects have this storage duration, except those declared static, extern or thread_local.
  • static storage duration. The storage for the object is allocated when the program begins and deallocated when the program ends. Only one instance of the object exists. All objects declared at namespace scope (including global namespace) have this storage duration, plus those declared with static or extern.
  • thread storage duration. The storage for the object is allocated when the thread begins and deallocated when the thread ends. Each thread has its own instance of the object. Only objects declared thread_local have this storage duration. thread_local can appear together with static or extern to adjust linkage.

(since C++11)

  • dynamic storage duration. The storage for the object is allocated and deallocated per request by using dynamic memory allocation functions.
constexpr char kFoxSays[] = "Abay-ba-da bum-bum bay-do";

初始化没有顺序。一个全局变量可能指到另一个全局变量。但那个全局变量可能还有初始化或者已经end了。

各全局变量的析构函数是顺序调用的,与调用构造函数的顺序是相反的。这就保证做到“先构造的全局类变量后析构。”

Dynamic initialization is not ordered across translation units, and neither is destruction (except that destruction happens in reverse order of initialization).

When one initialization refers to another variable with static storage duration, it is possible that this causes an object to be accessed before its lifetime has begun (or after its lifetime has ended). Moreover, when a program starts threads that are not joined at exit, those threads may attempt to access objects after their lifetime has ended if their destructor has already run.

[运营] ext4分区遇到“Structure needs cleaning”问题,怎么解决 - 结构需要清理 摘要:当ext4文件系统出现"Structure needs cleaning"错误时,表明存在元数据损坏。解决方法包括:1)检查系统日志确认错误;2)卸载受影响分区;3)使用fsck.ext4分步骤修复(先测试模式-n,再保守修复-p,严重损坏时用-y强制修复);4)检查修复结果;5)重新挂载。若数据丢失可尝试从lost+found恢复。建议定期备份、避免异常关机并定期检查文件系统,以防硬件故障导致类似问题。修复前务必备份重要数据。 阅读详情

相关推荐

Halcon如何判定一个区域变量是否初始化

众所周知,halcon图像处理领域主要包含三类变量:图像[image]、区域[region]和轮廓[xld]。 程序中有时候会用到如何判定一个区域变量为空 或者 是否被初始化?这是两个问题,解决方案如下: 1.判定一个region变量是否为空: gen_empty_obj(IsEmpty) if(x = IsEmpty) .... endif 按以上这样子进行判断。 2.判定一个region变量是否经过初始化: gen_empty_region(IsEmpty) if(x = IsEmp

NCUTer 4844

C++全局变量初始化的一点总结

注意:本文所说的全局变量指的是 variables with static storage,措词来自 c++ 的语言标准文档。   什么时候初始化   根据 C++ 标准,全局变量初始化要在 main 函数执行前完成,常识无疑,但是这个说法有点含糊,main 函数执行前到底具体是什么时候呢?是编译时还是运行时?答案是既有编译时,也可能会有运行时(seriously), 从语言的层面来说,全局变量初始化可以认为分成以下两个阶段(c++11 N3690 3.6.2):   static initialization: 静态初始化指的是用常量来对变量进行初始化,主要包括 zero init

MATLAB代码实现了船舶航线优化的功能,使用混合遗传算法(结合模拟退火算法)来寻找从大连港到格拉斯通港的最优航线,同时考虑了船舶的参数、气象数据(风速、风向、有效波高、波浪阻力系数等)对航行的影响

这段MATLAB代码主要实现了船舶航线优化的功能,使用混合遗传算法(结合模拟退火算法)来寻找从大连港到格拉斯通港的最优航线,同时考虑了船舶的参数、气象数据(风速、风向、有效波高、波浪阻力系数等)对航行的影响。通过以上步骤,该代码能够找到一条在考虑船舶性能和气象条件下,从大连港到格拉斯通港的较优航线,最小化燃油消耗和航行时间的加权和。

AI的内部世界的博客 495

c++ 全局变量初始化的一点总结

注意:本文所说的全局变量指的是 variables with static storage,措词来自 c++ 的语言标准文档。 什么时候初始化 根据 C++ 标准,全局变量初始化要在 main 函数执行前完成,常识无疑,但是这个说法有点含糊,main 函数执行前到底具体是什么时候呢?是编译时还是运行时?答案是既有编译时,也可能会有运行时(seriously), 从语言的层面来说,全局变量初始化...

weixin_34161032的博客 740

全局变量初始化

注:以下例子仅是讨论C++语法,绝非推荐在实践中利用它们。例1extern int y;int x = y;int y = x;int main() ...{}例2extern int y;int x = y;int y = 3;int main() ...{}例3inf f()...{    return 3;}int x = y;in y = f();

Alex's walking 3768

debug版程序运行正常,release版程序运行出错

1. 检查是否有变量没有初始化,尤其是重要的控制变量。  debug会对程序中没有初始化的局部变量进行初始化全局变量在两种版本中都会被初始化),而release不会,因此release版中没有初始化的变量的值运行时是不确定的。而debug版中没有初始化的整型会被初始化为0,指针也会被初始化为0,也就是空指针。这样就可以避免很多错误,或者使得错误的出现有规律,便于查错。 2. 定位rele

纸上得来终觉浅 1741

C/C++中局部/全局变量初始值或默认值问题

C/C++中局部/全局变量初始值或默认值问题 原文写的实在是太好了,心生敬意,拿过来收藏一下,这里是源文章地址:C/C++中局部/全局变量初始值或默认值问题 目录C/C++中局部/全局变量初始值或默认值问题一、初始化的语法二、默认初始化规则三、静态和全局变量初始化四、成员变量的初始化五、封闭类嵌套成员的初始化 在C语言中的全局变量和静态变量都是会自动初始化为0,堆和栈中的局部变量不会初始化而拥有不可预测的值。 C++保证了所有对象与对象成员都会初始化,但其中基本数据类型的初始化还得依赖于构造函数。 下文来

Lanyan9的博客 7332

HALCON 控制变量没有初始化_HALCON中级篇:条码识别

条码条码读取时相当容易的,你初始化一个条码模型,然后执行读条码的算子。在这个算子中,你需要制定期望的条码类型,那样,你可以通过不断的应用不同参数的这个算子就可以读取不同的条码类型,但是没有必要为每一个条码类型去创建一个单独的模型。读取的结果是一个包含条码的区域和解码的字符串。HALCON读码器的优势就是它的易用性,没有在编程或者图像处理方面先进经验的要求,仅仅是几个清除简单排序的算子的应用。还有,...

weixin_39588252的博客 2031

HALCON 控制变量没有初始化_OA大典故障案例摘录【第1397篇】理光2501如何载体初始化 ?...

看过3000案例你也是专家何以证明唯有时间一故障案例每日一例【第1397篇】咨询问题:理光2501载体初始化 河北邢台群友 二〇一六年三月二十八日?技术热线:朱师傅百度一下你会发现非常专业的方法介绍:极简版:2-801普通版:进维修模式 SP2-801 专业的意思是就是:一般人看不懂下面是人话版1、依次按黄色键 1 0 72、按住红色停止键3秒以上,进入sp模式:...

weixin_39789327的博客 3359

halcon学习笔记——(5)HDevelop language(异常处理)

异常处理: try ... catch ... endtry:异常算子处理句柄 throw:允许处理用户定义的意外情况。 作者:韩兆新 出处:http://hanzhaoxin.cnblogs.com/

Sound_tactics的博客 776

C/C++ --- 全局变量初始化总结

注意:本文所说的全局变量指的是 variables with static storage,措词来自 c++ 的语言标准文档。 什么时候初始化 根据 C++ 标准,全局变量初始化要在 main 函数执行前完成,常识无疑,但是这个说法有点含糊,main 函数执行前到底具体是什么时候呢?是编译时还是运行时?答案是既有编译时,也可能会有运行时(seriously), 从语言的层面来说,全局

xl928471061的博客 5564

C++全局变量初始化过程

全局变量在main()前完成初始化(调用构造函数) 在调用构造函数前,全局变量已分配空间,内存全0 多个全局变量初始化,按照代码编译的顺序 注意:全局变量被访问前可能它还没有调用构造函数初始化。 如果一个项目中,多个dll都用到一个全局变量在共同的lib中,则每个dll都有一个独立的全局变量(地址不同),每个全局变量初始化。 如下代码,A里面访问了全局变量g_b, 改变全局变量g_a...

vcpro126的专栏 2458

15、C++对象的初始化和清理

一、构造函数和析构函数 构造函数:编译器自动调用,主要为对象成员属性赋值, 程序在调用对象时,自动调用构造函数 有参数,可以发生重载 析构函数:对象销毁前,系统自动调用,执行一些清理工作 程序在对象销毁前,自动调用析构函数,无需手动调用 没有参数,不可以重载 编译器提供的构造函数和析构函数是空的 二、构造函数的分类及调用 1.分类 参数分类...

m0_48716770的博客 257

Halcon(二)-图像初始化的几种方式

本文主要讨论,如何将数据从外设(相机),转换到Halcon对象,从而用Halcon进行后续的图像处理。和翻译文档不同,从使用场景的视角,有以下几种图像初始化方法。

小华同学的学习笔记 7805

Halcon教程系列/启蒙----(1)初识Halcon

本教程全部基于Halcon12.0 开发环境 窗口布局 打开halcon后 基本布局从上到下依次是文件栏、工具栏、以及图形窗口和程序编辑器,打开变量窗口或者算子窗口会显示相应的窗口。 a.通过文件栏—>窗口—>打开窗口名称来打开相应窗口 b.如果发现窗口比较乱,可以通过文件栏—>窗口—>排列窗口进行初始化窗口位置 1.图形窗口 图形窗口显示每一行代码显示的图想,图像窗口...

u013241583的博客 5649

【机器视觉】 HDevelop语言基础(二)-变量和表达式

00. 目录 文章目录00. 目录01. 概述02. 变量的类型03. 变量的作用域04. 图像对象操作05. 输入控制参数表达式5.1 元组操作的一般特征5.2 赋值操作5.3 元组基本操作5.4 创建元组5.5 类型操作5.6 基本算术运算5.7 位操作5.8 字符串操作5.9 集合操作5.10 比较操作5.11 元素比较操作5.12 布尔操作5.13 三角函数操作5.14 指数函数操作5.15 数学运算操作5.16 杂项函数5.17 操作优先级06. 附录 01. 概述 变量的名称通常由字母、数字和下

C/C++软件工程师、嵌入式软件工程师、物联网研发工程师、C/C++讲师、物联网讲师、嵌入式讲师、鸿蒙讲师---欢迎大家一起交流(私信添加博主微信) 1596

C++对象的初始化和处理

生活中我们买的电子产品都基本会有出厂设置!在某一天我们不用时候也会删除一些自己信息数据保证安全。C++中的面向对象来源于生活,每个对象也都会有初始设置以及对象销毁前的清理数据的设置。

tydo达令的博客 1869

C++中的对象初始化

当对象在创建时获得了一个特定的值,我们说这个对象被初始化初始化不是赋值,初始化的含义是创建变量赋予其一个初始值,而赋值的含义是把当前值擦除,而以一个新值来替代。对象初始化可以分为默认初始化、直接初始化、拷贝初始化以及值初始化。 // (1)默认初始化 int i1;//默认初始化,在函数体之外(初始化为0) int f(void) { int i2;//不被初始化,如果使用此对象则报错 } string empty;//empty非显示的初始化一个空串,调用的是默认

转载和创作优秀的博客 3526

HALCON 控制变量没有初始化_【物理课堂】“控制变量法”在初中物理实验中的应用1(力、热、声部分)...

点击蓝字关注我的公众号个人简介  张涛,棠湖中学物理教师,2012年毕业于陕西师范大学,硕士研究生。曾获成都市青年物理教师赛课一等奖,双流区教坛新秀,双流区优秀青年教师。多次受邀在各级教研活动和教师培训中献课交流和专题发言。什么是“控制变量法”?当某个量与多个因素有关时,我们要研究这个量与某一个因素的关系时,需要控制其他因素不变(或相同),这种研究方法叫做“控制变量法”(也叫“单一变量法...

weixin_39643244的博客 917

VC++全局变量初始化

VC++全局变量初始化 2016年11月03日 19:40:51 hanford 阅读数:1713 目 录 第1章 说明2 1.1 程序启动2 1.2 强符号、弱符号2 1.3 动态初始化顺序3 1.4 exe调用dll4 1.5 禁用动态初始化4 1.6 应用实例5 第1章 说明 1.1 程序启动 参考下面的...

lusic01的专栏 1180

《信息系统安全与对抗实践》罗森林

《信息系统安全与对抗实践》罗森林

上一篇: win11什么时候发布的_2019年8月证券从业资格考试报名通知什么时候发布?
下一篇: 快速理解编程结构_什么才算是“真正的”编程能力?不提升这些能力,你何时能拿高薪...
weixin_39597636
博客等级 码龄9年 29粉丝 149原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值