有没有办法抑制全局对象的析构函数的生成(尤其是那些集合类型的析构函数,例如vector
and unordered_map
),或者在不调用此类析构函数的情况下退出程序(但仍然刷新标准输出,因为我收集abort
不这样做)?
问问题
386 次
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 回答