删除列表中的指针导致内存泄漏

时间:2015-09-30 19:58:11

标签: c++ pointers linked-list

所以我有一个程序(游戏但是c ++问题中的问题),它有一个Character类。这是有问题的类/方法的简化代码

例如

BaseCharacter.h

class BaseCharacter
{
    BaseCharacter();
    ~BaseCharacter();

    Weapon* m_currentWeapon;
    DoubleLinkedList<Weapon*> m_weaponsHeld;
}

BaseCharacter.cpp

BaseCharacter::BaseCharacter()
{
    m_currentWeapon = new Weapon();
    m_weaponsHeld.Insert(m_currentWeapon);
}
BaseCharacter::~BaseCharacter()
{
    m_weaponsHeld.Clear();
}

这个类的想法是每个角色都以一个起始武器(添加到武器列表)开始,并且还可以拥有多个武器(创建时通过列表存储)

插入和清除的列表功能就像这样

template <class C>
inline void
DoubleLinkedList<C>::Insert(const C &Data)
{
    LinkedListNode<C>* node = new LinkedListNode<C>(Data);

    if(m_tail)
    {
        m_tail->SetNext(node);
        node->SetPrevious(m_tail);
        m_tail = node;
    }
    else
    {
        m_head = node;
        m_tail = node;
    }
  listSize++;
}


template <class C>
inline void
DoubleLinkedList<C>::Clear()
{
    LinkedListNode<C>* entry = m_head;

    while (entry)
    {
        LinkedListNode<C>* release = entry;
        entry = entry->GetNext();
        delete release;
    }

    listSize = 0;
    m_head = 0;
    m_tail = 0;
}

我遇到的问题是当删除BaseCharacters类时,会调用析构函数并发生内存泄漏。

我真的不明白(我有一个小想法 - 当我清除列表而不是存储在列表中的对象时,我想删除指针指针)为什么在没有调用Weapon类析构函数时列表Clear()函数在BaseCharacters析构函数中调用。

有人能告诉我清理角色列表和武器的逻辑错误吗?

1 个答案:

答案 0 :(得分:0)

你真的有记忆 - 泄漏腐败吗?我可以想到腐败,因为你删除了武器,如果第二个玩家拥有相同的指针,武器DoubleLinkedList<C>::Clear试图再次释放同一个对象的内存。

删除delete可能会在这里起作用,但这不是最终的解决方案。有人必须own实际武器 - 可能是创建资产并将其分配给各个角色的游戏引擎。但为什么所有角色都共享同一个实例呢?难道每个玩家都不拥有自己的武器副本吗?我希望武器有一个单独的弹药计数,这不应该分享:)

因此每个玩家都应拥有自己的武器。