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



所以我有一个程序(游戏,但问题在c++问题),其中有一个字符类。这是所讨论的类/方法的简化代码

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();
}

这个类的想法是,每个角色开始与一个起始武器(这是添加到武器列表),也可以持有多个武器(当创建时存储通过列表)

Insert和Clear的List函数是这样的

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类被删除时,会调用析构函数并发生内存泄漏。

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

谁能告诉我在清理名单和武器的角色的逻辑错误?

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

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

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

相关内容

  • 没有找到相关文章

最新更新