所以,我正在尝试将向量与智能指针一起使用,以便更轻松地进行内存管理,并且......好吧,我遇到了问题。那是我的代码的(大大缩短的)版本:
子弹管理器.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;
};
子弹管理器.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]”放在项目符号类中。
现在,发生的事情(根据任务管理器)是:
- 调用 AddBullet 一次 -> 内存使用量略有增加
- 之后调用 EraseAllBullets -> 内存使用量根本没有下降!
- 多次调用 AddBullet -> 显着增加内存使用量
- 之后调用 EraseAllBullets -> 大部分内存被释放,但不是全部!
效果不是很大,而且似乎变慢了——程序开始时使用 10MB 的 RAM,在只使用这两个函数一段时间后,每个向量清除后,内存使用量仅下降到 15-20MB。
难道我做错了什么?即使这应该发生,我仍然希望能够释放我分配的所有内存。