函数参数上的 C++ 内存泄漏

标签 c++ memory-leaks

所以我将开门见山:我有一个函数正在向另一个类添加一些东西(恰好是一个类):

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/

相关文章:

c++ - _mm_fmadd_pd 程序收到信号 SIGILL,非法指令

c++ - 溢出的签名/未签名分配及其结果

c++ - 错误消息 : Invalid operands of types 'float' and 'int' to binary 'operator%'

c++ - 结构与对象属性和 C++ 中的 std::vector 的交互

c - 图像加载器中的内存泄漏

python - boost python 库链接问题 -- undefined symbol

C++:正确使用哈希和碰撞技术

objective-c - cocoa [[NSWorkspace 共享工作空间] iconForFile :filePath caused memory leaks

c++ - 即使 valgrind 没有显示内存泄漏,我是否应该在 c++11 的析构函数中清除 unique_ptr 的 vector

memory-leaks - iOS 12+ 内存泄漏 - WKWebView 和 UIWebView