2011-01-22 12 views
5

C++クラスを使用してメモリ内に多くの構造体を割り当てたC++をすぐに終了する方法を探しています。プログラムは正しく終了しますが、プログラムの最終的な "復帰"の後、すべての自動デストラクタが起動します。問題は、プログラムがC++クラス構造を介して約15GBのメモリを割り当てたことです。私が結果に気にしないにもかかわらず、それはすべての構造を歩くので、完了するのに約1時間以上かかる。プログラムはこの時点までにタスクを完了するのに1時間しかかかりませんでした。私はOSに戻って通常の卸売プロセス配分の削除をしたいのですが、これは非常に迅速です。私はクリーンアップ段階で手動でプロセスを強制終了することでこれを行ってきましたが、より良いプログラミックソリューションを探しています。多くのオブジェクトが割り当てられた状態でC++から素早く終了する

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

+6

デストラクタで何もしていない場合、1時間かかることはありません。それをブロックしているものがなければなりません。それをプロファイリングしてみましたか? – Naveen

答えて

1

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

1

Naveenによると、これはメモリの割り当て解除の問題ではありません。私は進化的アルゴリズムを使ってニューラルネットワークのシミュレーションを書いてきました。ここでは、大量のメモリを割り当てたり解放したりすることは重要ではありませんでした。

4

標準C++では、abort()しかありませんが、プロセスにはOSにエラーが返されます。

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

+0

_exit()は、POSIX関数(C++については何も言わない)なので、デストラクタについては何も言及していません。現在、プラットフォーム上のデストラクタを呼び出すことはありませんが、ドキュメントによって保証されているわけではありません。 –

+0

だからこそ私はこれが特定のプラットフォームで動作すると言ったのです。しかし、http://stackoverflow.com/q/4769229/585729で議論されているように、それが存在するどのプラットフォームでもそうであるはずです。 – JoergB

1

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

Windowsの場合は、ExitProcessを使用しても同じ効果が得られます。

しかし、他の人が言っているように、かなりの量のI/O(ログファイルの作成など)をしていない限り、デストラクタは実際には1時間もかかりません。時間を費やす場所を見極めるために、プログラムのプロファイルを強くお勧めします。

1

可能な戦略は、mainに直接表示されるオブジェクトの数によって異なります。これらのオブジェクトを介して15GBのデータにアクセスし、これらがローカルまたは静的に割り当てられている場合です。

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

データに静的に割り当てられた変数を使用してアクセスする場合は、ポインタを動的に割り当てられたメモリへのポインタ(または参照)に変更して意図的にリークさせることができます。

2

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

関連する問題