C标准保证全局和静态变量(如果未初始化)始终如此0.
这是我的问题:未初始化的全局变量和静态变量将转到BSS程序中的段.所以所谓的0应该是all-bit 0.
对于积分变量,all-bit 0将被评估为0.浮点变量,如果遵循IEEE 754,也是0.0.但是对于指针,空指针不一定是all-bit 0,所以像这样的全局指针的初始化:
int* p = NULL;
Run Code Online (Sandbox Code Playgroud)
只是:做出任何改变:
int *p;
Run Code Online (Sandbox Code Playgroud) 我有C++代码,它声明了由函数调用初始化的静态生命周期变量.被调用的函数构造一个vector实例并调用其push_back方法.代码是否会冒险通过C++静态初始化命令惨败?如果没有,为什么不呢?
补充资料:
什么是"静态初始化命令惨败"?
为什么我认为使用vector会引发惨败?
vector构造函数可能会使用动态初始化的另一个静态生命周期变量的值.如果是这样,那么vector在我vector在代码中使用之前,没有什么可以确保变量被初始化.初始化result(参见下面的代码)可能会vector在vector完全初始化依赖项之前调用构造函数,从而导致访问未初始化的内存.
这段代码到底是什么样的?
struct QueryEngine {
QueryEngine(const char *query, string *result_ptr)
: query(query), result_ptr(result_ptr) { }
static void AddQuery(const char *query, string *result_ptr) {
if (pending == NULL)
pending = new vector<QueryEngine>;
pending->push_back(QueryEngine(query, result_ptr));
}
const char *query;
string *result_ptr;
static vector<QueryEngine> *pending;
};
vector<QueryEngine> *QueryEngine::pending = NULL;
void Register(const char *query, string *result_ptr) {
QueryEngine::AddQuery(query, result_ptr); …Run Code Online (Sandbox Code Playgroud)