C++ 释放std::vector中的内存

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;

我有一个名为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
当我退出游戏(当我退出循环时),我必须释放我分配给游戏状态的记忆。所以我在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();