相关疑难解决方法(0)

初始化全局变量和静态变量为0总是不必要的?

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

24
推荐指数
2
解决办法
7001
查看次数

在静态初始化期间创建和使用向量是否安全?

我有C++代码,它声明了由函数调用初始化的静态生命周期变量.被调用的函数构造一个vector实例并调用其push_back方法.代码是否会冒险通过C++静态初始化命令惨败?如果没有,为什么不呢?

补充资料:

  1. 什么是"静态初始化命令惨败"?

    它在C++ FAQ 10.14中进行了解释

  2. 为什么我认为使用vector会引发惨败?

    vector构造函数可能会使用动态初始化的另一个静态生命周期变量的值.如果是这样,那么vector在我vector在代码中使用之前,没有什么可以确保变量被初始化.初始化result(参见下面的代码)可能会vectorvector完全初始化依赖项之前调用构造函数,从而导致访问未初始化的内存.

  3. 这段代码到底是什么样的?

    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)

c++ stdvector static-initialization

8
推荐指数
1
解决办法
718
查看次数

标签 统计

c ×1

c++ ×1

static-initialization ×1

stdvector ×1