gpt4 book ai didi

c++ - 全局构造函数的调用顺序是什么

转载 作者:太空狗 更新时间:2023-10-29 23:33:57 24 4
gpt4 key购买 nike

在 C++ 中以什么顺序调用全局对象的构造函数?

这个问题出现在管理某些消费者的内存需求的内存池的上下文中。我看到了一个相当大的源代码,它在全局命名空间中定义了一些仅使用堆函数的消费者。应在不更改消费者命名空间的情况下添加内存池。因此,我在全局命名空间中添加了一个池类和一个定义,并修改了每个使用者类以从类“thePool”的实例中获取内存。不幸的是,在调用所有全局析构函数的执行结束时,我遇到了一个很好的段错误。 gdb 回溯显示 pool::free 的分支产生了段错误。这对我来说听起来很奇怪。但是,我将其归结为一个非常简单的池/消费者示例,它位于全局命名空间中。不幸的是,这不会重现段错误——池的析构函数在消费者的所有析构函数之后被调用。这是纯粹的运气,还是对 g++ 4.5 的有根据的猜测?

这里是简化的例子:

#include<iostream>

using namespace std;


struct pool {
pool() {
cout << "pool::pool" << endl;
}
~pool() {
cout << "pool::~pool" << endl;
}
void get() {
cout << "pool::get" << endl;
}
void free() {
cout << "pool::free" << endl;
}
};

pool thePool;


struct consumer {
~consumer() {
cout << "consumer::~consumer" << endl;
thePool.free();
}
consumer() {
cout << "consumer::consumer" << endl;
thePool.get();
}
};



consumer a,b;

int main() {
}

输出是:

pool::pool
consumer::consumer
pool::get
consumer::consumer
pool::get
consumer::~consumer
pool::free
consumer::~consumer
pool::free
pool::~pool

不错!就像我想要的那样。纯粹的运气?我的意思是池的 dtor 可以在销毁消费者 a 或 b 之前调用,对吧?

要回答的问题是:“全局对象的调用顺序是什么?”

最佳答案

全局变量按照声明的顺序进行初始化。所以它们的构造函数将按照它们初始化的顺序被调用。这在一个 translation unit 内是正确的.但是,跨多个翻译单元的初始化顺序未由语言规范定义。

并且它们的析构函数像往常一样以与初始化相反的顺序调用。

关于c++ - 全局构造函数的调用顺序是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7222743/

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