1

私が取り組んでいる大規模なプロジェクトでメモリ リークに問題がありましたが、VS2010 メモリ チェッカーによると、プロジェクトにはリークはありません (そして、すべてを徹底的にチェックしました)。

リークが小規模で発生するかどうかを確認するために、簡単なテスト プログラムを作成することにしました。

struct TestStruct
{
    std::string x[100];
};
class TestClass
{
public:
std::vector<TestStruct*> testA;
//TestStruct** testA;
TestStruct xxx[100];
TestClass()
{
    testA.resize(100, NULL);
    //testA = new TestStruct*[100];
    for(unsigned int a = 0; a < 100; ++a)
    {
        testA[a] = new TestStruct;
    }
}
~TestClass()
{
    for(unsigned int a = 0; a < 100; ++a)
    {
        delete testA[a];
    }
    //delete [] testA;
    testA.clear();
}
};
int _tmain(int argc, _TCHAR* argv[])
{
    _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
    char inp;

    std::cin >> inp;
    {
        TestClass ttt[2];
        TestClass* bbbb = new TestClass[2];
        std::cin >> inp;
        delete [] bbbb;
    }
    std::cin >> inp;

    std::cin >> inp;
    return 0;
}

このコードを使用すると、プログラムは約 1 メガバイトのメモリから開始し、8 メガバイト以上まで増加し、最後に 1.5 メガバイトまで減少します。追加の 0.5 メガはどこに行くのですか? 私は粒子システムで同様の問題を抱えていますが、数百メガバイトの規模です。

私は一生、何が悪いのか理解できません。

余談ですが、(コメントアウトした) 配列を使用すると、無駄なメモリが大幅に削減されますが、完全に削減されるわけではありません。メモリ使用量は、最後の cin と最初の cin で同じになると予想されます。

タスクマネージャーを使用してメモリ使用量を監視しています。

ありがとう。

4

1 に答える 1

1

「私は一生、何が悪いのか理解できません。」

おそらく何もない。

「[プログラム] は、すべてのオブジェクトを破棄した後も、プログラムの終了時にさらに多くのメモリを使用します。」

プログラム終了時のメモリ使用量は気にする必要はありません。最新のオペレーティングシステムは、プロセスが終了したときに、プロセスに関連付けられているすべてのメモリを「解放」することを考慮しています。(技術的に言えば、プロセスのアドレス空間は単純に解放されます。)

プログラムの最後にメモリを解放すると、実際にはプログラムの終了が遅くなる可能性があります。これは、スワップ空間にあるメモリページに不必要にアクセスする必要があるためです。

その追加の 0.5MB はおそらくアロケーター (malloc/free、new/delete、std::allocator) に残ります。これらのアロケーターは通常、必要に応じてオペレーティング システムからメモリを要求し、都合のよいときに OS にメモリを返すという方法で機能します。フラグメンテーションは、アロケータが厳密に必要とされるよりも多くのメモリを保持しなければならない理由の 1 つになる可能性があります。また、オペレーティング システムからのメモリの要求は低速であるため、通常は一部のメモリを予約しておく方が高速です。

「メモリ使用量を監視するためにタスク マネージャを使用しています。」

実際、メモリ使用量の測定は、単一の数値を観察するよりも高度であり、仮想メモリと、プロセスとオペレーティング システム間のメモリ管理について十分に理解している必要があります。残念ながら、Windows 用の優れたツールはお勧めできません。

全体として、単純なプログラムで問題はないと思います。

于 2013-07-04T16:34:36.277 に答える