如何处理叮当声中的"exit-time destructor"警告?
How to deal with "exit-time destructor" warning in clang?
在我的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
相关文章:
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 为什么我会收到"Run-Time Check Failure #2 - Stack around the variable 'pr' was corrupted"错误?
- 我如何测试代码没有调用 exit()
- exit(0) 和 raise(SIGTERM) 有什么区别?
- "Program ended with exit code: 0"出现在我的输出的开头?
- 解析某些行的文本和输出"time of appearance"
- exit(EXITT_FAILURE)在c和c++中是如何工作的
- 在C++中使用exit()退出程序有问题吗
- 返回time()库函数的数据类型
- 如何将 time-uuid(存储在 boost uuid 中)转换为时间戳/自纪元以来的时间?
- 什么时候在 c++ 中使用 exit() 与异常更好?
- 如何从 boost::p osix_time::p time 获取秒数
- 调用 dll 函数时"Run-Time Check Failure #0 - The value of ESP"
- C++ SRAND(time(0)) 在猜谜游戏中不起作用
- "ndk-build finish with non-zero exit value 2" 在编译文本仙女项目时
- 即使包含 <time.h 后仍"‘CLOCK_PER_SEC’ was not declared in this scope"错误>
- 当可以返回错误/异常时,从库中终止调用程序(例如,调用exit())是否总是错误的?
- 我在C++中收到错误" [Error] ld returned 1 exit status".帮我解决这个问题
- 如何处理叮当声中的"exit-time destructor"警告?