所以我将开门见山:我有一个函数正在向另一个类添加一些东西(恰好是一个类):
tower->set_weapon(new NoWeapon());
set_weapon() 是塔类中的一个简单方法,它将一个内部变量与其接收的这个新的 NoWeapon 类相关联。
virtual void set_weapon(Weapon* weapon){ weapon_ = weapon; };
weapon_ 是指向 Weapon 类的指针,而 NoWeapon 在层次上是 weapon 的子类。当一切都说完之后,塔本身会清理一切:
weapon_->Clean();
delete weapon_;
但是,我仍然遇到内存泄漏。我在 VisualStudio 2013 上使用 vld,它在我提到的第一行检测到内存泄漏
tower->set_weapon(new NoWeapon());
知道为什么会这样吗?我该如何解决?
提前致谢!
编辑:感谢 YSC 提供的解决方案。事实上,我因为没有初始化原始武器指针而被泄露,但你的想法让我回到了正轨。
至于 unique_ptr 的想法,我以前玩过,但这不是我想要的解决方案。无论如何,感谢您的帮助。
最佳答案
我们缺少上下文信息,但基本上如果 Tower::set_weapon()
被调用两次,Tower::weapon_
就会被覆盖和内存泄漏。建议:
Tower::Tower()
: weapon_(nullptr)
{}
void Tower::set_weapon(Weapon* weapon)
{
if (weapon_ != nullptr)
{
weapon_->Clean(); // should be called by Weapon::~Weapon()
}
delete weapon_;
weapon_ = weapon;
};
您还可以使用 std::unique_ptr
:
class Tower
{
std::unique_ptr<Weapon> weapon_;
public:
Tower::Tower() {}
void set_weapon(std::unique_ptr<Weapon> weapon)
{
// assume Weapon::~Weapon() is fixed
weapon_ = std::move(weapon);
};
};
关于函数参数上的 C++ 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34228814/