所以我有一个程序(游戏但是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析构函数中调用。
有人能告诉我清理角色列表和武器的逻辑错误吗?
答案 0 :(得分:0)
你真的有记忆 - 泄漏或腐败吗?我可以想到腐败,因为你删除了武器,如果第二个玩家拥有相同的指针,武器DoubleLinkedList<C>::Clear
试图再次释放同一个对象的内存。
删除delete
可能会在这里起作用,但这不是最终的解决方案。有人必须own
实际武器 - 可能是创建资产并将其分配给各个角色的游戏引擎。但为什么所有角色都共享同一个实例呢?难道每个玩家都不拥有自己的武器副本吗?我希望武器有一个单独的弹药计数,这不应该分享:)
因此每个玩家都应拥有自己的武器。