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