全部变量、静态全局变量、类静态变量、atexit回调函数的调用顺序

本文通过一个C++示例程序详细探讨了全局变量、静态全局变量及类静态变量的构造与析构顺序,并验证了这些变量的初始化顺序与其定义顺序的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

巩固下c++基础,代码如下:

#include <iostream>
#include <vector>
#include <map>
#include <string>

std::vector<void*> structure;
std::map<void*, std::string> info;

class test1
{
public:
	test1(){
		structure.push_back(this);
	}

	~test1(){
		std::cout<<this<<"---~test1\n";
	}
};

class test2
{
public:
	test2(){
		structure.push_back(this);
	}

	~test2(){
		std::cout<<this<<"---~test2\n";
	}

	static test1 test1_;
};

class test3
{
public:
	test3(){
		structure.push_back(this);
	}

	~test3(){
		std::cout<<this<<"---~test3\n";
	}
};

class test4
{
public:
	test4(){
		structure.push_back(this);
	}

	~test4(){
		std::cout<<this<<"---~test4\n";
	}


	static test3 test3_;
};

void OnExit()
{
	std::cout<<"--------------------------------------\n";
	std::cout<<"Call OnExit\n";
}

static test3 static_test3_;
static test1 static_test1_;
test2 test2_;
test1 test1_;
test3 test4::test3_;
test1 test2::test1_;

int main(int argc, _TCHAR* argv[])
{
	std::cout<<"--------------------------------------\n";
	std::cout<<"Regist OnExit\n";
	atexit(OnExit);

	info[&test2_] = "全局变量test2_";
	info[&test1_] = "全局变量test1_";
	info[&static_test1_] = "静态全局变量test1_";
	info[&static_test3_] = "静态全局变量test3_";
	info[&test2::test1_] = "静态类变量test2::test1_";
	info[&test4::test3_] = "静态类变量test4::test3_";

	std::cout<<"------------------构造----------------\n";
	for(auto iter = structure.begin(), end = structure.end(); iter != end; ++iter)
	{
		std::cout<<*iter<<"---"<<info[*iter]<<"\n";
	}

	return 0;
}


执行结果:


总结:

1.全局变量,静态全局变量,类静态变量的构造顺序依赖于其定义顺序。

2.全局变量,静态全局变量,类静态变量的析构顺序和构造顺序相反。

3.atexit回调函数调用先与全局变量,静态全局变量,类静态变量析构函数调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值