所以我有一个程序(游戏,但问题在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
实际的武器-可能是游戏引擎创造资产并将其分配给个人角色。但是为什么所有的字符都共享同一个实例呢?难道每个玩家不应该拥有自己的武器副本吗?我希望武器有一个单独的弹药计数,这不应该被分享:)
因此每个玩家都应该拥有自己的武器