所以这是我的main / Initializer函数的简化版本。当我调用它并且必须向玩家发明者添加任何项目时,我收到Debug Assertation Failed错误。
在我看来,我在某种程度上混淆了范围?
我是否在函数范围内声明了一些新内容,然后无法在main中再次访问它?
我在函数内部尝试了一些内容,比如使用Getters / Setters而不是完全分配,就像p_player = p
一样,但我认为实际上并没有解决问题,我有点困惑。< / p>
int main()
{
Array<Item> items(3);
string itemsfilename = "itemsfile.txt";
Initializer::InitializeItems(items, itemsfilename);
Login login;
Player p1;
string filename = login.LoginToGame();
Initializer::InitializePlayer(p1, rooms, items, 3, filename);
}
void Initializer::InitializePlayer(Player& p_player, HashTable<string, Room>& p_rooms, Array<Item>& p_items, int p_numItems, std::string& p_filename)
{
ifstream playerfile(p_filename);
int inventorycount = 0;
//all the stuff needed to make a player
std::string name;
int health;
int confidence;
int humor;
int speed;
std::string room;
Room* currentRoom;
Inventory inventory(100);
//reading in values from file
for(int i = 0; i < inventorycount; i++)
{
playerfile.getline(value, 256);
std::string item(value);
for(int j = 0; j < p_numItems; j++)
{
if(p_items[j].GetName() == item)
{
inventory.AddItem(&(p_items[j])); //This line taken out, removes the error.
}
}
}
Player p(name, health, confidence, humor, speed, currentRoom, inventory);
p_player = p;
}
AddItem()接受一个指向项目的指针,然后将其附加到它的DLinkedList。
编辑:
我得到的错误是
Debug Assertation失败!
节目:zzz
文件f:\ dd / vctools / crt_bld / self_x86 / crt / src / dbgdel.cpp
行:52
表达式:_Block_TYPE_IS_VALID(pHead-&gt; nBlockUse)
AddItem()代码:
bool AddItem(Item* p_item)
{
if(p_item->GetWeight() + m_weight <= m_maxWeight)
{
m_inventory.Append(p_item);
m_weight += p_item->GetWeight();
}
else
{
return false;
}
return true;
}
答案 0 :(得分:1)
好的,所以我们仍然没有实际导致问题的代码,但我很确定我知道发生了什么,并避免陷入“添加更多代码的20个问题” - 有两种可能方案:
m_inventory
容器中存储指针。在销毁此容器时,通过调用项目上的delete
来销毁对象 - 由于内容未从堆中分配,因此无效。 inventory
时m_inventory
容器未正确复制,内容因为指向存储的指针失败而崩溃。 如果这没有帮助,那么请尝试将代码缩减为仅显示此问题的内容,而不使用我们不知道其内容的文件,并且可以将问题作为完整程序发布到所有问题中必要的代码[删除任何其他不需要的代码],所以我们可以看到一切。目前,我们只看到了一些代码,问题几乎肯定在您向我们展示的代码中。