所以,我試圖使用矢量與智能指針一起更容易與內存管理,以及...好吧,我有問題。 這就是(大大縮短)版本的我的代碼:vector加上unique_ptr到一個對象,內存不釋放?
bulletManager.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;
};
bulletManager.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類是抽象子彈類的子類。 爲了更容易地看到內存使用的變化,我使AddBullet函數生成了1000個對象,並且在項目符號類中放置了「char tab [10000]」。
現在,會發生什麼情況(根據任務管理器)是:
- 調用AddBullet一次 - >內存使用量略有增加,
- 後,調用EraseAllBullets - >內存使用情況根本不會滴!
- 調用AddBullet幾次 - >顯着的內存使用增加
- 之後調用EraseAllBullets - >大多數內存被釋放,但不是全部!
效果不是很大,似乎放慢了 - 程序以10MB的內存使用量開始,在使用這兩個函數一段時間後,每個向量清除內存使用量僅下降到15- 20MB。
我做錯了什麼?即使這種情況發生,如果我能夠釋放我分配的所有內存,我仍然會更喜歡。
如果這是Windows內存管理的事情,而不是我的錯,我已經很高興。這件事在過去的幾個小時裏讓我頭痛。 因此,唯一可靠檢查實際泄漏的好方法是使用探查器? – Adrian17
是DrMemory是一個不錯的選擇 –