如何处理clang中的"退出时间析构函数"警告?

Lar*_*der 34 c++ warnings destructor clang c++11

在我的C++ 11代码中,我在下面的例子中得到了clang警告"声明需要退出时析构函数":

static const std::map<int, const someStruct> mymap = {
    {1, {
        "A",
        "B",
        "C"
    }},
    {2, {
        "D",
        "E",
        "F"
    }}
};
Run Code Online (Sandbox Code Playgroud)

据我所知Google,"退出时析构函数"需要以确定的方式销毁main()和静态,以防止由于"已经释放的变量"导致退出时崩溃.是对的吗?有人能更好地解释一下吗?

另外:我能做些什么(我不想禁用警告)?上面的代码仅在一个线程的上下文中使用.

看起来这是Chromium处理这些案件的方式; 那对我的案子来说也是正确的方法吗?

#define CR_DEFINE_STATIC_LOCAL(type, name, arguments) \
  static type& name = *new type arguments
Run Code Online (Sandbox Code Playgroud)

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

yid*_*ing 18

当应用程序退出时,全局和函数静态对象将调用它们的析构函数.这些析构函数是"退出时间析构函数".并按照它们构造的相反顺序调用.

正如你所说,如果其中一些析构函数触及已经被破坏的对象,你的程序可能会崩溃.此外,在退出时运行的析构函数将使程序退出较慢,并且大多数时候它们对于程序的正确性不是必需的(因为当程序退出时,它将释放其所有内存).

警告只是指出你有退出时间将运行的析构函数.

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

  • @KonradRudolph该结构是三个“ const char *”。因此,我的同事正确地反对堆分配过大。有没有什么办法可以在没有分配堆的情况下使该警告消失? (2认同)