C++ 释放std::vector中的内存
我有一个名为GameState的抽象类,如下所示C++ 释放std::vector中的内存,c++,memory,vector,memory-management,memory-leaks,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;
#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
当我退出游戏(当我退出循环时),我必须释放我分配给游戏状态的记忆。所以我在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;
...
所以我将clean()函数放在gameStateManager的析构函数中,但由于检测到内存泄漏,它似乎无法工作
但问题是,当我自己删除上面代码中的所有状态时,并没有检测到内存泄漏。但是,它会导致未处理的异常(我猜是因为_states为null,因为我手动删除了它)
所以总而言之,,
-我使用clean函数在析构函数中取消分配向量组件(即游戏状态)的内存
- 但它似乎不工作(内存泄漏)
- 然而,删除所有的记忆让我很烦恼
你们能给我一些解决方案吗?或者,我遗漏了什么?你们的
向量
持有游戏状态*
指向分配了新
的对象的指针。必须使用delete
释放它们。因此,您需要添加,例如:
_states.back()->shutdown();
delete _states.back(); // <-- add this!
_states.pop_back();
\u states.back()->shutdown();
删除_states.back();//<代码>游戏> *LV1=新的LV1阶段游戏* LV2阶段=新的LV2阶段< /C> >无效C++。如果\u states
是std::vector
,则还需要删除_states.back()代码>。考虑使用<代码> STD::vector < /代码>,并使用<代码> ~GAMestAuto()/Cyp>隐式地破坏它自己的资源。然后,只需调用\u states.clear(),即可释放所有资源代码>。。请注意,调用states.clear()
是多余的,因为向量及其内容在超出范围时会自动销毁。这里需要注意的重要一点是,std::unique\u ptr
将在其被销毁时自动删除其内容(在本例中通过states.clear();
)。\u states
是指针向量吗?如果是这样,您从未删除过这些指针,因为这显然是一个初学者的问题:调用delete
与vector
无关<代码>矢量
管理自己的内存。delete
的需要源于new
的使用。
_states.back()->shutdown();
delete _states.back(); // <-- add this!
_states.pop_back();