【问题标题】:I can't figure out why my vector cannot push back我不知道为什么我的矢量不能推回
【发布时间】:2017-07-14 14:32:39
【问题描述】:

我想在我的游戏中创建商店和库存,但我的代码不断崩溃。我的程序在 addToInventory->addInventoryItems(name);我不知道为什么。

// inventory.h
struct InventoryItems
{
    string type;
};
vector<InventoryItems*> inventoryItems;

// inventory.cpp
void Inventory::addInventoryItems(string itemName)
{
    addItem->type = itemName;
    inventoryItems.push_back(addItem);
}


// shop.h
Inventory* addToInventory;

// shop.cpp
void Shop::purchase()
{
    string name = touchableSprites[i]->getSprite()->getName(); 
    addToInventory->addInventoryItems(name);  //crashes here
}

非常感谢!

【问题讨论】:

  • 你在哪里分配addToInventory
  • addToInventory 分配在哪里?我所看到的只是一个声明的指针,它在newed 中分配在哪里?就目前而言,您有一个未初始化的指针,访问它会导致未定义的行为或访问冲突
  • 请提供minimal reproducible example 您的代码中有很多未知数,最突出的是addItem

标签: c++ visual-c++ vector inventory


【解决方案1】:

我猜是 addItem 的问题,因为你没有设置类型

void Inventory::addInventoryItems(string itemName)
{
    InventoryItems addItem;
    addItem->type = itemName;
    inventoryItems.push_back(addItem);
}

【讨论】:

    【解决方案2】:

    此类错误通常发生在函数的执行同时执行时。

    例如:)

    #define SET_DEFAULT_DELAY {Sleep(100)}
    
    InventoryItems* addToInventory;
    TCHAR g_tszParam[MAX_PATH];
    
    DWORD WINAPI _VECTOR_OPERATION_01(LPVOID lParam)
    {
        while(TRUE)
        {
            if(0 == _tcsicmp(g_tszParam, _T("Default_Value"))
            {
                addToInventory->addInventoryItems(g_tszparam);
            }
            SET_DEFAULT_DELAY;
    
        }
    }
    
    DWORD WINAPI _VECTOR_OPERATION_02(LPVOID lParam)
    {
        while(TRUE)
        {
            if(0 == _tcsicmp(g_tszParam, _T("Special_Value"))
            {
                addToInventory->addInventoryItems(g_tszparam);
            }
            SET_DEFAULT_DELAY;
        }
    }
    
    int _tmain()
    {
        ...
        HANDLE hThread[2];
        hThread[0] = CreateThread(NULL, 0, _VECTOR_OPERATION_01, NULL, 0, 0);
        if(INVALID_HANDLE_VALUE != hThread[0])
        {
            CloseHandle(hThread[0]);
        }
        hThread[1] = CreateThread(NULL, 0, _VECTOR_OPERATION_02, NULL, 0, 0);
        if(INVALID_HANDLE_VALUE != hThread[1])
        {
            CloseHandle(hThread[1]);
        }
        ...
        return 1;
    }
    

    在这种情况下,线程执行的结果取决于g_tszParam 的值。但是,如果一个线程执行 Vector 相关函数,而另一个线程在另一个线程中执行 Vector 相关函数,则会发生冲突。

    我不知道投机者是什么,因为我没有你的源代码。 但在我看来,这就是发生该错误的原因。

    【讨论】:

      猜你喜欢
      • 2011-03-18
      • 2016-10-19
      • 2018-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多