c++ - 静态分配的内存在静态取消初始化期间会变得无效吗?

标签 c++ memory static destructor

假设我定义了一个像这样的变量(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 之前构造,您可以确定 BA之后被破坏。这就给我们留下了构造函数顺序的问题。

这是我记得的:

  1. 全局和静态对象是在调用 main() 之前构造的。
  2. 类局部静态在其类的任何对象之前构造。
  3. 函数局部静态是在第一次达到其作用域时构造的。
  4. 同一翻译单元内的全局和静态对象按照它们定义的顺序构造。 (这意味着 header 包含的顺序可能会影响这一点!)
  5. 跨翻译单元的全局和静态对象的构造顺序未定义。

我对其中一些内容有点模糊,所以如果您认为这不正确,请纠正我。

关于c++ - 静态分配的内存在静态取消初始化期间会变得无效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3785808/

相关文章:

Java 枚举静态最终实例变量

C++ 链表迭代成员访问运算符

c++ - 我可以将具有 float 的 POD 数组转换为 float* 吗?

c++ - 将 "this"对象的 shared_ptr 获取到另一个函数 : giving run time exception

java - 使用带有 `public static final` 对象的 Java Spring 注入(inject)(对于 Jakarta Unstandard)

c++ - 为什么 c++ 编译器接受这个初始化?静态整数 x = x;

c++ - 包含通过引用修改值的 lambda 的结构

memory - ollydbg内存断点的原理是什么?

ios - 数组只是不断添加对象和内存崩溃

linux - 找出内存占用大小