全局布尔变量在全局销毁期间是否可靠?
Is a global boolean variable reliable during global destruction?
如果我有一个简单的数据类型作为全局变量——比如布尔标志;具体来说,没有析构函数的东西——即使在全局销毁期间,该变量是否仍然可靠?还是不能保证?
例如,以下代码的结果是否定义明确?
Flag.h:
void SetFlagState(bool flag);
bool GetFlagState();
Flag.cpp:
#include <Flag.h>
namespace { // local declarations
bool g_flag;
}
void SetFlagState(bool flag)
{
g_flag = flag;
}
bool GetFlagState()
{
return g_flag;
}
主线:
#include <iostream>
#include <Flag.h>
class FlagChecker
{
public:
~FlagChecker()
{
std::cout << "Flag value: " << GetFlagState() << std::endl;
}
};
FlagChecker g_FlagChecker; // global instance; dtor will be called on exit
int main()
{
SetFlagState(true);
}
是的,这是安全的。存储的生命周期就是程序的持续时间。那个生命周期中的主要问题是初始化的时刻(通过你的g_Flagchecker
)。由于内置类型没有 "de-initialization" 这样的东西,只要您的进程中有代码在执行,您的 g_flag
仍然有效。
如果我有一个简单的数据类型作为全局变量——比如布尔标志;具体来说,没有析构函数的东西——即使在全局销毁期间,该变量是否仍然可靠?还是不能保证?
例如,以下代码的结果是否定义明确?
Flag.h:
void SetFlagState(bool flag);
bool GetFlagState();
Flag.cpp:
#include <Flag.h>
namespace { // local declarations
bool g_flag;
}
void SetFlagState(bool flag)
{
g_flag = flag;
}
bool GetFlagState()
{
return g_flag;
}
主线:
#include <iostream>
#include <Flag.h>
class FlagChecker
{
public:
~FlagChecker()
{
std::cout << "Flag value: " << GetFlagState() << std::endl;
}
};
FlagChecker g_FlagChecker; // global instance; dtor will be called on exit
int main()
{
SetFlagState(true);
}
是的,这是安全的。存储的生命周期就是程序的持续时间。那个生命周期中的主要问题是初始化的时刻(通过你的g_Flagchecker
)。由于内置类型没有 "de-initialization" 这样的东西,只要您的进程中有代码在执行,您的 g_flag
仍然有效。