-1

所以这是我的 main / Initializer 函数的简化版本。当我调用它并且它必须向玩家发明者添加任何项目时,我得到一个 Debug Assertation Failed 错误。

在我看来,我有点混淆了范围?
我是否在函数范围内声明了一些新内容,然后无法在 main 中再次访问它?
我在函数内部尝试了一些东西,比如使用 Getters/Setters 而不是完全分配,就像p_player = 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。

编辑:
我得到的错误是
调试断言失败!

程序:zzz
文件 f:\dd/vctools/crt_bld/self_x86/crt/src/dbgdel.cpp 行:52

表达式:_Block_TYPE_IS_VALID(pHead->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;
}
4

1 回答 1

1

好的,所以我们仍然没有实际导致问题的代码,但我很确定我知道发生了什么,并且为了避免陷入“添加更多代码的 20 个问题”——有两种可能的情况:

  1. Items 是一个对象数组,您将指向它们的指针存储在m_inventory容器中。销毁此容器时,通过调用delete项目来销毁对象-这不起作用,因为内容不是从堆中分配的。
  2. 当您复制容器时inventorym_inventory没有正确复制容器,并且内容会因为指向存储的指针失败而分崩离析。

如果这没有帮助,那么请尝试将您的代码减少到仅显示此问题的内容,而不使用我们不知道其内容的文件,并且可以将其作为完整程序发布在问题中,并包含所有必要的代码[删除任何其他不需要的代码],所以我们可以看到一切。目前,我们只看到一小部分代码,而且几乎可以肯定问题直接出在您向我们展示的代码中。

于 2013-05-12T06:59:17.453 回答