深入探讨如何控制全局对象创建和销毁的顺序.doc

深入探讨如何控制全局对象创建和销毁的顺序.doc

ID:50251518

大小:116.00 KB

页数:14页

时间:2020-03-05

深入探讨如何控制全局对象创建和销毁的顺序.doc_第1页
深入探讨如何控制全局对象创建和销毁的顺序.doc_第2页
深入探讨如何控制全局对象创建和销毁的顺序.doc_第3页
深入探讨如何控制全局对象创建和销毁的顺序.doc_第4页
深入探讨如何控制全局对象创建和销毁的顺序.doc_第5页
资源描述:

《深入探讨如何控制全局对象创建和销毁的顺序.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尚未创建或者已经被销毁。希望证实一下么?我们试试

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。