2

そこで、ベクトルをスマート ポインターと一緒に使用してメモリ管理を簡単にしようとしていますが、問題が発生しています。それは私のコードの(大幅に短縮された)バージョンです:

bulletManager.h:

class BulletManager
{
    public:
        BulletManager();
        virtual ~BulletManager();

        void AddBullet(int type, double x, double y, double vx, double vy);
        void EraseAllBullets();
    protected:
    private:
        std::vector<std::unique_ptr<Bullet>> bullets;
};

bulletManager.cpp:

BulletManager::BulletManager()
{
    bullets.reserve(50000);
}
void BulletManager::AddBullet(int type, double x, double y, double vx, double vy)
{
    for(int i=0;i<1000;i++) bullets.push_back(std::unique_ptr<BasicBullet>(new BasicBullet(type, x, y, vx, vy)));
}
void BulletManager::EraseAllBullets()
{
    bullets.clear();
}

BasicBullet クラスは、抽象 Bullet クラスのサブクラスです。メモリ使用量の変化を簡単に確認できるように、AddBullet 関数で 1000 個のオブジェクトを生成し、"char tab[10000]" を bullet クラスに配置しました。

さて、何が起こるか(タスクマネージャーによると)は次のとおりです。

  • AddBullet を 1 回呼び出す -> メモリ使用量がわずかに増加する
  • その後 EraseAllBullets を呼び出します -> メモリ使用量はまったく低下しません!
  • AddBullet を数回呼び出す -> メモリ使用量が大幅に増加
  • その後 EraseAllBullets を呼び出す -> ほとんどのメモリが解放されますが、すべてではありません!

影響はそれほど大きくなく、速度が低下しているように見えます。プログラムは 10MB の RAM 使用量で開始し、しばらくこれら 2 つの関数のみを使用した後、各ベクトルをクリアすると、メモリ使用量は 15 ~ 20MB に低下します。

私は何か間違ったことをしていますか?それが起こるはずだとしても、私が割り当てたすべてのメモリを解放できればなお良いと思います。

4

2 に答える 2

4

アプリケーションが割り当てた/使用可能なメモリの量をタスクマネージャーに頼ることはできません。メモリを解放すると、OS に返されるのではなく、アプリケーションで後で再利用するために、C++ ランタイム内のプールによって再利用される可能性があります。

于 2013-06-28T17:27:03.103 に答える