0

プログラムでメモリを解放した後でも、メモリの使用量が増加することがわかりました。そこで、それを検証するために 2 つの単純な C++ テスト プログラムを作成しました。

#define NUM 1000000
void Test1()
{
    PrintMemory("Test1 Beginning");
    double* Data = new double[NUM];

    for(int i = 0; i < NUM; i++)
    {
        Data[i] = std::rand() % 1000;
    }

    double sum = 0;
    for(int i = 0; i < NUM; i++)
    {
        sum += Data[i];
    }

    delete [] Data;
    PrintMemory("end");
}

double* Data[NUM];
void Test2()
{
    PrintMemory("Test2 Beginning");

    for(int i = 0; i < NUM; i++)
    {
        Data[i] = new double;
        *(Data[i]) = std::rand() % 1000;
    }

    double sum = 0;
    for(int i = 0; i < NUM; i++)
    {
        sum += *(Data[i]);
    }

    for(int i = 0; i < NUM; i++)
    {
        delete Data[i];
    }
    PrintMemory("end");
}

void main()
{
    Test1();
    Test2();
}

関数内PrintMemoryで API を呼び出して、構造体GetProcessMemoryInfoのフィールドである使用済みメモリに関する情報を取得します。PrivateUsagePROCESS_MEMORY_COUNTERS_EX

出力は次のとおりです。

MemUsed: Test1で 5544kb 開始 MemUsed:
終了
で 5568kb MemUsed: Test2 で 5568kb 開始
MemUsed: 終了で 6404kb

出力がわかりません。が呼び出された後、delete使用されたメモリの量が以前の値に回復するはずです。使用されるメモリの量は、オペレータnewおよびの呼び出し番号に関連していますdelete

4

2 に答える 2

0

余分なメモリは、ここで使用されるヒープの量と実際には直接関係していないと思います。実際のメモリ割り当てではなく、追加のメモリ管理オーバーヘッドなどの可能性があります。Roman が指摘しているように、8MB を割り当てていることになります。代わりに、多くの小さなブロックを割り当てると、メモリ割り当てを追跡するためにより多くのオーバーヘッドが使用され、2 番目のケースではより多くのメモリが消費されます。もちろん、そのメモリは割り当ての一部ではないため、実際のメモリが解放されても、実際には解放されません。

それを「そのまま」にしてしまうと・・・

test1 と test2 をそれぞれ 50 回実行すると、メモリ使用量がある時点で上昇し続けることはないと予想されます。すぐには発生しない可能性がありますが、数回実行すると、「定常状態」に到達します。

于 2013-02-01T10:11:25.073 に答える