在我的C ++ 11代码中,在下列情况下我得到了clang警告“声明需要退出时析构函数”:
static const std::map<int, const someStruct> mymap = {
{1, {
"A",
"B",
"C"
}},
{2, {
"D",
"E",
"F"
}}
};
据我所知Google,“退出时析构函数”需要以确定的方式销毁main()和静态,以防止因“已释放的变量”导致退出时崩溃。是对的吗?有人可以更好地解释一下吗?
另外:我能做些什么(我不想禁用警告)?上面的代码仅在一个线程的上下文中使用。
看起来这是Chromium处理这些案件的方式;这对我的案子来说也是正确的方法吗?
#define CR_DEFINE_STATIC_LOCAL(type, name, arguments) \
static type& name = *new type arguments
答案 0 :(得分:18)
当应用程序退出时,全局和函数静态对象将调用它们的析构函数。这些析构函数是“退出时间析构函数”。并按照它们构造的相反顺序调用。
正如你所说,如果其中一些析构函数触及已经被破坏的对象,你的程序可能会崩溃。此外,在退出时运行的析构函数将使程序退出较慢,并且大多数时候它们对于程序的正确性不是必需的(因为当程序退出时,它将释放所有内存)。
警告只是指出你的析构函数将在退出时运行。
您建议的修补程序将堆分配对象,这不会导致它在程序退出时自动销毁。对于你的情况,这可能已经足够了。
答案 1 :(得分:1)
查看属性 no_destroy/always_destroy https://clang.llvm.org/docs/AttributeReference.html