C++全局对象, 静态对象,或类的静态成员对象,在进程退出时会执行析构函数,并且动作发生在main函数结束之后。
进程都要退出了,一般没有必要再执行析构函数了,如果真的需要执行析构,那也应该是运行时显式调用释放资源的方法。
在xcode中可以配置C++的链接选项[Linking] - [Other Linker Flags]
,增加-Wexit-time-destructors
即可开启exit-time destructor问题检查。
例子
#include <iostream>
class MyTest
{
public:
// 要实现析构函数
~MyTest() {}
void func() {}
};
// 会提示warning
static MyTest g_test;
int main(int argc, const char * argv[]) {
g_test.func();
return 0;
}
使用堆对象(new)来避免退出时析构
static MyTest& g_test = *new MyTest();
chromium的源码中,针对这种问题定义了一个通用的宏:
#define CR_DEFINE_STATIC_LOCAL(type, name, arguments) \
static type& name = *new type arguments
// 上面的例子可以这样定义:
CR_DEFINE_STATIC_LOCAL(MyTest, g_test, ());
参考
http://stackoverflow.com/questions/14335494/how-to-deal-with-exit-time-destructor-warning-in-clang http://stackoverflow.com/questions/15708411/how-to-deal-with-global-constructor-warning-in-clang