假设我定义了一个像这样的变量(C++):
static const char str[] = "Here is some string data";
我有一个静态分配的类实例,它在其析构函数中引用该数组,这会出错吗?例如。可以吗str变量不知何故变得无效?
class A {
~A() {
cout << str << endl;
}
};
static A a;
我的假设是它不会出错,但我可以在任何地方找到明确的说明。我想确切地知道这一点。我的假设是,我们无法预测静态分配对象的析构函数被调用的顺序,但数据本身永远不会真正释放,直到进程被拆除。这意味着指向 POD 的指针应该是安全的,但对象实例则不然。
意思例如这:
static const QString str = "Here is some string data";
or
static const std::string str = "Here is some string data";
不能安全地用于A的析构函数,因为它们都在堆上分配字符串数据,并且析构函数可能会在之前释放该数据A的析构函数被调用。
我的假设正确吗?C++ 标准中是否有任何章节解释了这一点,或者是否有其他权威机构可以验证这一点的链接?
自动、全局和静态对象的析构函数的调用顺序始终是明确定义的:它与构造函数的调用顺序相反。所以如果对象A
引用一个对象B
and B
was 之前建造的 A
,你可以确定B
is 之后被毁坏 A
。这就给我们留下了构造函数顺序的问题。
这是我记得的:
- 全局对象和静态对象是在之前构造的
main()
叫做。
- 类局部静态是在其类的任何对象之前构造的。
- 函数局部静态是在第一次到达其作用域时构造的。
- 全局和静态对象在同一翻译单元内按照定义的顺序构造。 (这意味着标头包含的顺序可能会影响这一点!)
- 全局对象和静态对象的构造顺序跨翻译单元未定义。
我对其中一些内容有点模糊,所以如果您认为这是正确的,请纠正我。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)