来自静态链接库的静态变量在其构造之前使用

问题描述

我试图为自己创建一个单元测试框架,它运行良好,直到我把它变成一个静态库。静态容器 unit_base::_units 在构造之前使用。

我用以下更简单的版本重现了这个问题:

lib.lib

lib.h

#pragma once

#include <vector>
namespace est {
    class unit_base
    {
    public:
        unit_base();
        class unit_vec : public std::vector<unit_base*> {
        public:
            unit_vec();
            ~unit_vec();
        };
        static unit_vec& get_units();
        virtual bool run() const = 0;
    private:
        static unit_vec _units;
    };

    bool test_all();
}

lib.c

#include "lib.h"
#include <iostream>

namespace est {
    unit_base::unit_vec unit_base::_units;
    unit_base::unit_base() {
        _units.push_back(this);
        std::cout << "push unit to: " << &_units << std::endl;
    } 
    unit_base::unit_vec::unit_vec() {
        std::cout << "vec(): " << this << std::endl;
    }
    unit_base::unit_vec::~unit_vec() {
        std::cout << "~vec(): " << this << std::endl;
    }
    unit_base::unit_vec& unit_base::get_units()
    {
        return _units;
    }
    bool test_all()
    {
        std::cout << "before get_units" << std::endl;
        auto& units = unit_base::get_units();
        std::cout << "after get units" << std::endl;
        for(auto& u: units) {
            u->run();
        }
        return false;
    }
}

exe

test.cpp

#include "lib.h"
#include <iostream>

namespace est
{
    bool est_test_func();
    class est_test : public unit_base
    {
    public:
        est_test():
            unit_base() {}
        bool run() const override
        {
            return est_test_func();
        }
    };
    static est_test est_test_inst;
    bool est_test_func() {
        std::cout << "test" << std::endl;
        return true;
    }
}

int main(int argc,char** argv)
{
    est::test_all();
}

exe 打印:

推送单元到:0x7f72dc873170
vec(): 0x7f72dc873170
在 get_units
之前 获得单位后
~vec(): 0x7f72dc873170

我在 Windows 和 WSL 上对其进行了测试,结果都是 test_all() 的 _units 为空。 我一定是做错了什么,所以我在这里寻求帮助。

我使用 CMakeLists 创建了一个存储库:https://github.com/Lucipetus/problemic.git

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)