0

アプリケーションの最後に、次のように呼び出してクリーンアップします。

delete [] array1;
delete [] array2;
delete [] array3;
delete [] array4;
delete [] array5;
delete [] array6;
delete [] array7;
delete [] array8;
delete [] array9;
delete [] array10;
delete [] array11;
delete [] array12;
delete [] array13;

ヒープ上の配列への 13 個のポインター。デバッグモードでは絶対的な時間がかかります...実際には瞬時であるはずの場合、3〜5分などです。何を与える?

更新: C スタイルの構造体 (つまり、プリミティブとポインターのみの構造体) の配列を削除していると思いましたが、2 つの配列には hash_maps があり、クリーンアップに多くの時間を費やしていました。

4

3 に答える 3

3

配列がデストラクタを持つオブジェクトを保持している場合、delete[] は各デストラクタを呼び出します。

配列が大きい場合、デストラクタを呼び出す前にオブジェクトを仮想メモリからスワップインする必要がある場合があります。

構成によっては、delete[] が配列の境界領域をチェックして、範囲外の書き込みを行ったかどうかを確認する場合があります。

一般に、デバッグ モードでの実行時間は完全に無視する必要がありますが、配列を解放するだけで 3 ~ 5 分かかることに疑問を抱く理由は理解できます。

于 2012-04-07T15:20:17.353 に答える
0

パフォーマンスが気になる場合は、プロファイラーでコードを実行してください。プロファイラーを語らずしてパフォーマンスについて語ることはできません。

于 2012-04-07T17:50:32.070 に答える
0

起こりうることがいくつかあります。プログラムが遅い間に数回停止してみて、デバッガーのスタックにあるものを確認してください。

要素の型が配列であっても、デストラクタは要素ごとに 1 回呼び出されることを思い出してください。

于 2012-04-07T15:14:42.277 に答える