您的位置:首页 > 编程语言 > C语言/C++

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

2017-06-22 23:09 267 查看
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重复调用构造函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: