我是一个名为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函数来解析析构函数中的向量组件(即游戏状态)的记忆。
但它似乎无效(内存泄漏)
然而,自己删除所有记忆困扰着我。
你们能给我一些解决方案,或者我错过了什么?
答案 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
将是从向量中删除对象时自动为您调用。