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重复调用构造函数
{
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重复调用构造函数
相关文章推荐
- SqlServer中的对象依赖关系处理
- C/C++之全局、static对象/变量的初始化问题
- [C++再学习系列] 全局或静态变量(对象)的初始化
- C++ 全局/静态对象初始化
- c++ java中关于protobuf反序列化对象实体和实体处理(函数)关系(二)
- SSM框架之spring学习1——创建对象,处理依赖关系
- spring中IOC容器创建对象,对象依赖关系处理
- C++中关于全局对象的初始化顺序
- C++全局对象的初始化和析构
- C++中关于全局对象的初始化顺序
- c++ java中关于protobuf反序列化对象实体和实体处理(函数)关系 (一)
- C++ 全局对象初始化
- [C++再学习系列] 全局或静态变量(对象)的初始化
- 对C++文件组织及全局对象的理解
- 发现数据库对象的依赖关系
- 类图和对象图教程-类(Class)、接口(Interface)、协作(collaboration)、依赖关系(Dependency)、泛化关系(Generalization)、关联关系(Association)以及实现关系(Realization)
- [C++再学习系列] 跨编译单元的对象初始化
- 代码大全 . 处理代码依赖关系 . 阶段性编程
- Java对象创建和初始化过程,处理字符串的机制
- effective c++ 关于c++对象的初始化。