假设我定义了一个像这样的变量(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";
或
static const std::string str = "Here is some string data";
不能安全地在 A 的析构函数中使用,因为它们都在堆上分配字符串数据,并且析构函数可能会在 A 的析构函数之前释放该字符串数据被调用。
我的假设正确吗?C++ 标准中是否有任何章节对此进行了解释,或者指向其他可以验证这一点的权威机构的链接?
最佳答案
自动、全局和静态对象的析构函数的调用顺序始终是明确定义的:它与构造函数的调用顺序相反。因此,如果对象 A
引用对象 B
并且 B
在 A
之前构造,您可以确定 B
在A
之后被破坏。这就给我们留下了构造函数顺序的问题。
这是我记得的:
- 全局和静态对象是在调用
main()
之前构造的。 - 类局部静态在其类的任何对象之前构造。
- 函数局部静态是在第一次达到其作用域时构造的。
- 同一翻译单元内的全局和静态对象按照它们定义的顺序构造。 (这意味着 header 包含的顺序可能会影响这一点!)
- 跨翻译单元的全局和静态对象的构造顺序未定义。
我对其中一些内容有点模糊,所以如果您认为这不正确,请纠正我。
关于c++ - 静态分配的内存在静态取消初始化期间会变得无效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3785808/