如何处理叮当声中的"exit-time destructor"警告?

How to deal with "exit-time destructor" warning in clang?

本文关键字:exit-time destructor 警告 叮当声 何处理 处理      更新时间:2023-10-16

在我的c++ 11代码中,在以下情况下,我得到了clang警告"声明需要一个退出时析构函数":

static const std::map<int, const someStruct> mymap = {
    {1, {
        "A",
        "B",
        "C"
    }},
    {2, {
        "D",
        "E",
        "F"
    }}
};

据我所知,谷歌需要一个"退出时析构函数"以确定性的方式销毁main()和静态,以防止由于"已经释放的变量"而在退出时崩溃。对吗?有人能解释得更好吗?

附加:我能做些什么(我不想禁用警告)?上面的代码只在一个线程的上下文中使用。

看起来这是Chromium处理这些情况的方式;这对我的案子也适用吗?

#define CR_DEFINE_STATIC_LOCAL(type, name, arguments) 
  static type& name = *new type arguments

(来源:https://chromium.googlesource.com/chromium/src/+/32352 ad08ee673a4d43e8593ce988b224f6482d3/基地/basictypes.h)

全局和函数静态对象将在退出应用程序时调用它们的析构函数。这些析构函数是"退出时间析构函数"。

如前所述,如果其中一些析构函数触及已经被销毁的对象,程序可能会崩溃。此外,在退出时运行析构函数会使程序退出速度变慢,而且大多数情况下,它们对于程序的正确性来说是不必要的(因为当程序退出时,无论如何都会释放所有内存)。

警告只是指出你有析构函数将在退出时运行。

您建议的修复将堆分配对象,这将不会导致它在程序退出时自动销毁。对于您的情况,这可能已经足够了。

参见属性no_destroy/always_destroyhttps://clang.llvm.org/docs/AttributeReference.html