欢迎来到天天文库
浏览记录
ID:50251518
大小:116.00 KB
页数:14页
时间:2020-03-05
《深入探讨如何控制全局对象创建和销毁的顺序.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、深入探讨如何控制全局对象创建和销毁的顺序1概述在开始探讨之前,请让我们先看-一个程序,这个程序是由两个程序文件(A.cpp和B.cpp)及一个头文件(B.人)组成。其中,A.cpp屮定义了一个类ClassA及其ClassA的全局对彖globalAoB.cpp/h中,声明并定义了一个类ClassB及其全局对象globalBo其中,在ClassA的实现中,需要使用全局对象globalB进行一些处理(输出文本)。程序代码如下:【程序1J“A.cpp”^include*B.h*classClassA{public:
2、ClassA(){globalB・Display(^ClassA()construct");}^ClassA(){globalB.Display(^ClassA()destruct");}voidShow(constchar*text){globalB・Dispkty(text);}};ClassAglobalA;intmain(void){globalA・Sh()w("iiidin()begin");globalA.Show("mdin()end");return0;}“B.h”#ifndef_Class
3、B^defineClassB^includeclassClassBstd::stringm_name:public:ClassB(constchar*name);^ClassB():voidDisplay(constchar*text);};externClassBglobalB;#endif〃_ClassB_“B.cpp”^includeh"#includeClassBglobalB(z/gl()balBzz);ClassB::ClassB(constchar*name)
4、:m_name(name){,,”printf("ClassB::ClassB(,%s*)construet,z,m_name.c_str());)ClassB::^ClassB(){”printf("ClassB::CldssB('%s‘)destruct,z,m_naine.c_str());}voidClassB::Display(constchar*text){,,”printfDisplay:%szm_name.c_str(),text);将上而这个程序编译、链接后,执行结果是什么呢
5、?在读完程序后,也许你会毫不犹豫的冋答:'globalB*Display:ClassAOconstruct'globdlB'Display:mainObegin'globalB'Display:main()end'globalB*Display:ClassAOdestruct然而,对么?答案是:不一定!不一定?为什么?屮间两个输出没问题,结果是确定的,关键是第•行和最后一行。第…行输出是在ClassA的构造函数屮使用全局对象globalB的Display函数实现的,而最厉-•行输出是在ClassA的析构函数
6、屮使用全局对彖globalB來实现的。问题的关键是,在A.epp屮ClassA的实例,也是•个全局对象globalA,能保iiEglobalA―定会在globalB之后才被创建,在globalB销毁之前被销毁么?假如globalA在globalB被创趙之前就被创惣,则其构造两数运行时»globalB尚未被创建,这时uglobalB.Display(,zClassA()construct");”这行代码意味着将会访问一个未被创建的对彖,其结果将是未知的一一可能得不到所期望的结果,也可能是程序崩溃!2全局对象的
7、创建和销毁的标准顺序我们知道,所有全局对象会在mainO函数之前被创建在nidin()函数退出后被销毁。但在存在儿个全局对象的情况卜,这儿个全局对象的创建和销毁顺序是怎样的呢?C卄规定,在同一个编译单元(同一个・cpp程序)中,先定义的对象先创建,后定义的对象后创建;而销毁时则相反,后定义的对象先销毁,先定义的对象后销毁。但在不同的・cpp程序中,顺序又如何?C+4对此则没有定义,不同的编译器和链接器可能会有不同的处理。通常的情况与链接的顺序有关。这也就是说,上而这个程序,完全有可能出现globalA先于g
8、lobalB创建的情况.如果你用VC6编译上面的程序,运行结果将是:''Display:ClassAOconstructyglobalB,Display:intiinObegin'globalB'Display:main()end''Display:ClassAOdestruct第一行和最后一行的输出,没有能正确的显示出"globalB",原因就是此吋globalB尚未创建或者已经被销毁。希望证实一下么?我们试试
此文档下载收益归作者所有