跳过C ++全局析构函数

时间:2012-06-16 06:16:00

标签: c++ destructor exit

是否有办法抑制全局对象(特别是vectorunordered_map等集合类型的析构函数)的生成,或者在不调用此类析构函数的情况下退出程序(但是仍在冲洗stdout,因为我收集abort不这样做?

3 个答案:

答案 0 :(得分:4)

我相信你正在寻找quick_exit和_Exit。

答案 1 :(得分:2)

最简单的方法是在堆上创建它们,永远不要释放:

std::vector< int > *doNotCallDestructor = new std::vector< int >;
//...

答案 2 :(得分:2)

这是一种可以通过按需初始化来稳健解决的问题。

std::vector<int> & get_my_vector () {
    static std::vector<int> *vec;
    if (vec) return *vec;
    return *(vec = new std::vector<int>);
}

在多线程上下文中,您可以使用“双重检查锁定”来初始化静态,或者如果您有C ++ 11,则保证以下内容是线程安全的:

std::vector<int> & get_my_vector () {
    static std::vector<int> *vec = new std::vector<int>;
    return *vec;
}

按需初始化可带来以下好处:

  • 全局变量的延迟初始化 - 这意味着如果不使用全局,则不会为其分配任何内存。传统的全局变量占用资源。
  • 对共享库初始化依赖性的免疫 - 这意味着如果一个共享库想要使用另一个共享库的全局,则Singleton模式会触发代码按需进行全局初始化。从其他共享库访问时,传统的全局变量可能尚未初始化。

按需初始化与用于在Singleton模式中实例化单例的技术相同。因为我们没有限制vector<int>的实例数量,所以这个成语在任何意义上都不是单身人士。