C++ 我想我弄乱了这些指针的范围,C++;?

C++ 我想我弄乱了这些指针的范围,C++;?,c++,memory,scope,C++,Memory,Scope,这是我的主/初始值设定项函数的简化版本。当我调用它并且它必须向players inventor添加任何项目时,我会得到一个Debug Assertation Failed错误 在我看来,我似乎有点混淆了范围? 我是否在函数范围内声明了新的内容,然后又无法在main中再次访问它? 我在函数内部做了一些尝试,比如使用getter/setter而不是完全赋值,比如p_player=p,但我认为这根本不能解决问题,我有点困惑 int main() { Array<Item> item

这是我的主/初始值设定项函数的简化版本。当我调用它并且它必须向players inventor添加任何项目时,我会得到一个Debug Assertation Failed错误

在我看来,我似乎有点混淆了范围?
我是否在函数范围内声明了新的内容,然后又无法在main中再次访问它?
我在函数内部做了一些尝试,比如使用getter/setter而不是完全赋值,比如
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;
}  
intmain()
{
数组项(3);
字符串itemsfilename=“itemsfile.txt”;
初始值设定项::初始值设定项(items,itemsfilename);
登录;
玩家p1;
字符串文件名=login.LoginToGame();
初始化器::初始化层(p1,房间,项目,3,文件名);
}  
无效初始值设定项::初始值设定层(播放器和p_播放器、哈希表和p_文件室、数组和p_项目、int p_numItems、std::字符串和p_文件名)
{
ifstream播放器文件(p_文件名);
int inventorycount=0;
//成为一名球员所需要的一切
std::字符串名;
国际卫生组织;
自信;
幽默;
整数速度;
标准:弦室;
房间*当前房间;
存货(100);
//从文件中读取值
for(int i=0;i
AddItem()获取指向项的指针,然后将其附加到其DLinkedList

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

节目:zzz
文件f:\dd/vctools/crt_bld/self_x86/crt/src/dbgdel.cpp 电话号码:52

表达式:\块\类型\有效(pHead->nBlockUse)

AddItem()代码:

bool AddItem(项目*p_项目)
{
如果(p_项目->GetWeight()+m_weight GetWeight();
}
其他的
{
返回false;
}
返回true;
}

好的,我们仍然没有真正导致问题的代码,但我非常确定我知道发生了什么,为了避免陷入“添加更多代码的20个问题”,有两种可能的情况:

  • Items是一个对象数组,您将指向它们的指针存储在
    m_inventory
    容器中。销毁此容器时,通过调用Items上的
    delete
    来销毁对象-这不起作用,因为未从堆中分配内容
  • 当您复制
    inventory
    时,
    m_inventory
    容器未被正确复制,并且由于指向存储的指针出现故障,内容会散开

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

    它在哪一行断言?错误消息是什么?您的帖子中没有立即清楚。请解释“调试断言失败”更详细一点。错误消息是什么?什么断言失败了?什么测试使它失败了?因为
    inventory.AddItem(…)
    is(显然)导致问题的原因是,将这一行添加到您的问题中可能会有所帮助。因此,从我所知,这听起来像是#1?m#U清单使用内部双链接列表,析构函数使用
    delete itr
    ,其中itr是指向节点(包含项目指针)的指针正如您所说,首先使用
    m\u Array=new Datatype[p\u size]
    创建对象数组,然后使用
    delete[]m_array;
    。我不太确定之后会出现什么问题,也不知道如何解决。谢谢您,如果您使用的是
    delete itr;
    ,那么首先需要使用
    new
    来创建对象。
    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;
    }