释放std :: vector中的内存

时间:2017-05-12 03:44:11

标签: c++ memory vector memory-management memory-leaks

我是一个名为GameState的抽象类,看起来像这样,

#ifndef GAMESTATE_H
#define GAMESTATE_H

#include <iostream>

class GameState
{
public:
    virtual ~GameState(void) = 0 { std::cout << "~GameState" << std::endl; };

    virtual void init     (void) = 0;
    virtual void update   (void) = 0;
    virtual void shutdown (void) = 0;

private:

};

#endif

在main.cpp中,

// Lv1Stage and Lv2Stage is derived class from GameState class.
GameState* lv1Stage = new Lv1Stage
GameState* lv2Stage = new Lv2Stage

// This adds states to state vector which is in gameStateManager.
gameStateManager.addState(lv1Stage);
gameStateManager.addState(lv2Stage);



while(gameStateManager.getType() != ST_QUIT)
    {
        gameStateManager.update();
    }

当我退出游戏时(当我离开循环时),我必须释放我分配给GameState的记忆。所以我在GameStateManager中创建了一个名为clean的函数,它看起来像这样。

void GameStateManager::clean(void)
{   
    while (!_states.empty())
    {
         //first, release all memories of each states.
        _states.back()->shutdown();
         //and then, clear memory of state..
        _states.pop_back();
    }

    _states.clear();

}

我制作这个清洁功能的原因是,我不想删除我每次添加的所有游戏状态,例如,

delete lv1Stage;
delete lv2Stage;
delete lv3Stage;
... 

所以我在gameStateManager的析构函数中放了clean()函数,但是因为我检测到内存泄漏所以它似乎无法正常工作。

但问题是,当我自己删除所有状态时,就像上面的代码一样,没有检测到内存泄漏。但是,它会导致未处理的异常(我的猜测是因为_states为null因为我手动删除了它。)

所以,最后, - 我使用clean函数来解析析构函数中的向量组件(即游戏状态)的记忆。

  • 但它似乎无效(内存泄漏)

  • 然而,自己删除所有记忆困扰着我。

你们能给我一些解决方案,或者我错过了什么?

1 个答案:

答案 0 :(得分:2)

您的vector持有GameState*指向分配有new的对象的指针。他们必须delete释放。所以,你需要添加它,例如:

_states.back()->shutdown();
delete _states.back(); // <-- add this!
_states.pop_back();

如果您使用的是C ++ 11或更高版本,则可以将vector更改为保留std::unique_ptr<GameState>个对象而不是原始GameState*指针,然后delete将是从向量中删除对象时自动为您调用。