1

有没有办法抑制全局对象的析构函数的生成(尤其是那些集合类型的析构函数,例如vectorand unordered_map),或者在不调用此类析构函数的情况下退出程序(但仍然刷新标准输出,因为我收集abort不这样做)?

4

3 回答 3

5

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

于 2012-06-16T06:18:42.810 回答
2

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

std::vector< int > *doNotCallDestructor = new std::vector< int >;
//...
于 2012-06-16T06:19:38.657 回答
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;
}

按需初始化提供以下好处:

  • 全局变量的延迟初始化——这意味着如果不使用全局变量,则不会为其分配内存。传统的全局变量一开始就占用资源。
  • 不受共享库初始化依赖的影响——这意味着如果一个共享库想要使用另一个共享库的全局,单例模式会触发代码按需初始化该全局。当从不同的共享库访问时,传统的全局变量可能尚未初始化。

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

于 2012-06-16T07:31:27.993 回答