グローバル オブジェクト (特にvector
やなどのコレクション型のデストラクタ) の生成を抑制する方法unordered_map
、またはそのようなデストラクタを呼び出さずにプログラムを終了する方法abort
はありますか?
質問する
386 次
3 に答える
5
あなたはquick_exitと _Exit を探していると思います。
于 2012-06-16T06:18:42.810 に答える
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 パターンがコードをトリガーして、そのグローバルの初期化をオンデマンドで実行することを意味します。従来のグローバルは、別の共有ライブラリからアクセスしたときにまだ初期化されていない可能性があります。
オンデマンドの初期化は、シングルトン パターンでシングルトンをインスタンス化するために使用されるのと同じ手法です。このイディオムのインスタンス数を制限していvector<int>
ないため、いかなる意味でもシングルトンではありません。
于 2012-06-16T07:31:27.993 に答える
2
これを行う最も簡単な方法は、ヒープ上にそれらを作成し、決して解放しないことです:
std::vector< int > *doNotCallDestructor = new std::vector< int >;
//...
于 2012-06-16T06:19:38.657 に答える