2

次の C++ コードを見てください。

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

class Buf
{
public:
    Buf(size_t size)
    {
        _storage.reserve(size);
    }
    ~Buf()
    {
        vector<int> temp;
        _storage.swap( temp );//release memory
    }
    vector<int> _storage;
};

int main()
{
    int i = 0;
    while( ++i < 10000)
    {       
        Buf *buf = new Buf(100000);
        delete buf;
    }

    return 0;
}

デバッグモード(VS2008)で実行します:行にブレークポイントを設定したとき

//main function
int i = 0;

Process MyProgram.exe が Windows タスク マネージャーで約 300KB のメモリを占有していることがわかりました。行にブレーク ポイントを設定すると、

return 0;

Process MyProgram.exe は、Windows タスク マネージャーで約 700 KB を占有します。

私の質問は、なぜプログラムが占有するメモリが増加したのですか?正確にメモリを解放したと思います~なぜですか?

4

2 に答える 2

3

標準メモリ アロケータは、(通常) メモリの割り当てを解除しても OS にメモリを解放しません。代わりに、プロセスの後続の割り当てのためにそれを保持します。

したがって、メモリの割り当てを解除しても、TM のメモリ使用量が減少することはありません。

于 2012-11-13T11:17:20.820 に答える
3

OS /デバッグ環境は最適化手法を採用している可能性があり、メモリ解放はおそらくそれをプールに戻すだけです。実際のメモリ解放は、おそらくプログラムの終了時に行われます

于 2012-11-13T11:17:37.860 に答える