gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:21:28 25 4
gpt4 key购买 nike

假设我定义了这样一个变量 (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. 全局和静态对象在同一个翻译单元中按照它们被定义的顺序构造。 (这意味着标题的包含顺序可能会影响这一点!)
  5. 全局和静态对象的构建顺序跨翻译单元未定义。

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com