相关疑难解决方法(0)

查找C++静态初始化顺序问题

我们遇到了静态初始化命令惨败的一些问题,我正在寻找方法来梳理大量代码以找到可能发生的事件.有关如何有效地做到这一点的任何建议?

编辑:我得到了一些关于如何解决静态初始化顺序问题的好答案,但这不是我的问题.我想知道如何查找受此问题影响的对象.在这方面,Evan的答案似乎是迄今为止最好的答案; 我不认为我们可以使用valgrind,但我们可能有可以执行类似功能的内存分析工具.只有在给定构建的初始化顺序错误的情况下才能捕获问题,并且顺序可以随每个构建而改变.也许有一个静态分析工具可以捕捉到这一点.我们的平台是在AIX上运行的IBM XLC/C++编译器.

c++ initialization static-order-fiasco

59
推荐指数
5
解决办法
5万
查看次数

程序退出期间的函数局部静态初始化

标准对程序退出期间的函数局部静态初始化有什么看法? 编辑:为了清楚起见,我的意思是代码示例中的情况 - 本地静态b是在构造另一个静态之后a构造的(因此应该b在之前销毁a),但b也在a的析构函数期间构造,所以它应该立即销毁吗?后?优?

我没有设法找到有关此事的任何参考资料。

我想知道这种情况是 UB,还是应该有一些定义的行为?

下面的代码就是一个例子:

struct B{};

void foo()
{
    static B b;
}

struct A
{
    ~A() { foo(); }
};

int main()
{
    static A a;
    
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如您所见,A 的析构函数会在程序退出时发生(因为它具有静态存储),并且它会尝试构造 B 静态实例。

我对 C++17 更感兴趣,如果它在这个主题上有什么不同的话。

c++ static object-lifetime language-lawyer

15
推荐指数
1
解决办法
209
查看次数