小编aec*_*ley的帖子

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

我有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

static-initialization ×1

stdvector ×1