5

C++ クラスを使用してメモリ内に多くの構造体を割り当てた C++ をすばやく終了する方法を探しています。プログラムは正常に終了しますが、プログラムの最後の「リターン」の後、すべての自動デストラクタが作動します。問題は、プログラムが多くの C++ クラス構造を通じて約 15GB のメモリを割り当てていることです。結果は気にしませんが、すべての構造を通過するため、完了するまでにさらに約 1 時間かかります。プログラムは、この時点までのタスクを完了するのに 1 時間しかかかりませんでした。OS に戻り、通常の大規模なプロセス割り当ての削除を実行させたいと思います。これは非常に迅速です。クリーンアップ段階でプロセスを手動で強制終了することでこれを行ってきましたが、より良いプログラムによる解決策を探しています。

OS に成功を返したいのですが、メモリの内容を保持する必要はありません。プログラムは通常の処理中に多くの動的割り当て/割り当て解除を実行するため、単純なヒープ管理ではありません。

ご意見はありますか?

4

6 に答える 6

4

標準 C++ では、abort() しかありませんが、プロセスは OS に失敗を返します。

多くのプラットフォーム (Unix、MS Windows) では、クリーンアップやデストラクタを実行せずに _exit() を使用してプログラムを終了できます。

于 2011-01-22T17:01:04.773 に答える
3

C++0x std::quick_exitは、コンパイラが既にサポートしている場合に探しているものです (g++-4.4.5 はサポートしています)。

于 2011-01-22T18:38:57.793 に答える
1

15 GB のメモリーがかなり少数のクラスに割り当てられている場合、それらのクラスのオペレーター delete をオーバーライドできます。呼び出しを標準の削除に渡すだけですが、設定されている場合はノーオペレーションの削除を呼び出すグローバル フラグを設定します。または、プログラムのロジックが、データ構造を構築する通常の過程でこれらのオブジェクトが削除されないようなものである場合、これらのクラスのすべてのケースで単純に削除を無視することができます。

于 2011-01-22T16:55:15.487 に答える
1

Naveen が言うように、これはメモリの割り当て解除の問題ではありません。私は進化的アルゴリズムを使用してニューラル ネットワーク シミュレーションを作成しました。このアルゴリズムでは、小さなチャンクと大きなチャンクで大量のメモリを割り当てて解放しましたが、これは決して大きな問題ではありませんでした。

于 2011-01-22T16:56:34.823 に答える
1

C99 コンパイラを使用している場合は、関数を使用して、_Exitグローバル オブジェクト デストラクタや登録済みの関数を呼び出すことなく、すぐに終了できatexitます。書き込まれていないバッファリングされたファイルデータがフラッシュされるかどうか、開いているストリームが閉じられるかどうか、または一時ファイルが削除されるかどうかは、実装によって定義されます (C99 §7.20.4.4)。

Windows を使用している場合は、 を使用ExitProcessして同じ効果を達成することもできます。

しかし、他の人が言ったように、かなりの量の I/O (ログ ファイルの書き込みなど) を行っていない限り、デストラクタの実行に 1 時間もかからないはずです。プログラムをプロファイリングして、どこで時間が費やされているかを確認することを強くお勧めします。

于 2011-01-22T17:05:34.617 に答える
1

可能な戦略はmain、15 GB のデータにアクセスするために直接表示されるオブジェクトの数と、それらがメインに対してローカルであるか静的に割り当てられているかによって異なります。

15 GB のデータへのすべてのアクセスが のローカル オブジェクトを介して行われる場合は、の末尾にある を単にmainに置き換えることができます。アプリケーションを終了し、静的に割り当てられた変数のクリーンアップをトリガーしますが、ローカル変数のクリーンアップはトリガーしません。return 0;mainexit(0);
exit

静的に割り当てられた少数の変数を介してデータにアクセスする場合、それらを動的に割り当てられたメモリへのポインター (または参照) に変換し、故意にリークする可能性があります。

于 2011-01-22T17:07:25.177 に答える