C++全局对象初始化依赖关系处理

发布时间:2017-6-29 10:01:22编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"C++全局对象初始化依赖关系处理",主要涉及到C++全局对象初始化依赖关系处理方面的内容,对于C++全局对象初始化依赖关系处理感兴趣的同学可以参考一下。

class A

{

private:

    int m_nSize;

public:

    A()

    {

        m_nSize = 100;

m_pList = new char[4];

        memset(m_pList, 0,sizeof(4*sizeof(char)));

    }

    int GetSize()

    {

        return m_nSize;

    }

};


A  g_Aobj;


class B

{

public:

    B()

    {

        int i = g_Aobj.GetSize();

    }

};


B g_Bobj

问题就出现在g_Aobj和g_Bobj的初始化上面,由于这两个变量是全局变量,因此其不是在程序的堆和栈上面分配空间,而是预先在程序的全局数据区中分配了内存。

但是这个时候,g_Aobj和g_Bobj的构造函数还没有调用,调用是编译器生成一个函数来调用它们的构造函数,然后这个函数会放在main函数执行之前,可是这两个对象的构造函数都调用顺序编译器并不保证,如果先调用B全局对象都构造函数,那么这时候就出问题额,可能此时A全局对象返回都大小m_nSize还是一个未初始化的随机数字。


解决这种无法保证全局对象初始化顺序的依赖关系的问题,就是将全局对象改为一个存取函数,将全局对象封在函数中作为局部静态变量,例如


A& Global_A()

{

    static A g_Aobj;

    return g_Aobj;

}


B&  Global_B()

{

    static B g_Bobj; 

    return g_Bobj;

}


B::B()

{

    int i = Global_A().GetSize();    //这里就保证了一定初始化A的全局对象

}

这种做法在多线程中存在一定的隐患,可能导致g_Bobj重复调用构造函数


上一篇:AxonFramework,存储库
下一篇:搭建环境

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。

好贷网好贷款