0

メモリの割り当てと削除を試していますが、メモリを適切に削除/解放する方法について質問がありました。以下は、非常に小さくて機能するコードです。

#include <windows.h>
#include <vector>
#include <iostream>

using namespace std;

int main() {
    cout << "Initial" << endl;
    system("Pause");

    double* Array = new double[50000];
    for(int i = 0; i < 50000; i++)
    {
        Array[i] = rand();
    }

    cout << "Array created" << endl;
    system("Pause");

    delete[] Array;

    cout << "Array deleted" << endl;
    system("Pause");

    return 1;
}

システムを一時停止するたびに、Windowsタスクマネージャーを使用して、アプリケーションが使用しているメモリの量を確認しました。以下は私の結果からの数字です:

  • 初期744KB
  • アレイ作成1120KB
  • アレイが削除されました1124KB

それで、C ++教育で何かを逃したことがありますか?delete []が呼び出された後、配列に割り当てられたメモリを解放しないでください。

4

2 に答える 2

3

いいえ、何も見逃していません。タスクマネージャーがあなたに完全な真実を伝えていないというだけです(まあ、それはあなたが必要とする観点からあなたに真実を伝えていません)。呼び出しをプログラムするとdelete[]、メモリはプログラムによる再利用のために解放されますが、オペレーティングシステムには戻されません。プログラムの観点からは、メモリが解放されます。次のの呼び出しでnew同じメモリチャンクが要求されます。しかし、OS(およびタスクマネージャー)の観点からは、プログラムは依然としてメモリを保持しています。

何が起こっているかを確認するには、割り当てを数回実行し、ループで割り当てを解除し、タスクマネージャーのメモリの合計量が最初の割り当て後に取得した「最高水準点」から上がらないことを確認します。

于 2013-01-07T04:14:23.300 に答える
0

使用するコンパイラによって異なります。一部のコンパイラでは、削除されたメモリはアプリケーションによって保持され、すぐにOSに戻されません。現在、公式リンクが見つかりません。

于 2013-01-07T04:18:46.217 に答える