C++ 通过多个函数传递指针并获取错误

C++ 通过多个函数传递指针并获取错误,c++,function,pointers,C++,Function,Pointers,我试图在一个文本游戏练习中为房间创建一个框架。游戏的工作方式是房间是类,其中包含指向瓷砖指针数组的指针,每个瓷砖都有一个指向容器的指针,该容器表示瓷砖上的项目 它的实现非常简单,编译也很好。但是,当我尝试将对象放置到平铺上时,我遇到了一些问题。这是通过通过多个传递函数传递指向对象的指针来实现的。指针被传递到磁贴的placeOnTile(Thing*i)函数,该函数将指针传递到磁贴容器的addItem(Thing*th)函数,该函数运行一个简单的检查以确保它适合容器(与maxSize int进行比

我试图在一个文本游戏练习中为房间创建一个框架。游戏的工作方式是房间是类,其中包含指向瓷砖指针数组的指针,每个瓷砖都有一个指向容器的指针,该容器表示瓷砖上的项目

它的实现非常简单,编译也很好。但是,当我尝试将
对象
放置到
平铺
上时,我遇到了一些问题。这是通过通过多个传递函数传递指向对象的指针来实现的。指针被传递到磁贴的
placeOnTile(Thing*i)
函数,该函数将指针传递到磁贴容器的
addItem(Thing*th)
函数,该函数运行一个简单的检查以确保它适合容器(与
maxSize int
进行比较),如果它适合,则返回true

根据调试监视,指针(名为
placer
)在过程中没有变化(这很好)。但是,当它到达最终的passthrough函数(容器的
addItem(Thing*th)
)时,它将segfault并不会继续运行程序

下面列出了我能想到的相关代码示例。如果有更多我应该包括,请让我知道

大体上:

cout << "Bedroom Demo" << endl << endl;
    cout << "Creating bedroom obj...";
    Bedroom b1;  //this calls the constructor for Bedroom
    cout << "done." << endl << endl;
在Tile.h中:

bool placeOnTile(Thing * i){return onTile->addItem(i);}
在Container.h中(onTile是封装在平铺中的容器对象):

在Container.cpp中:

bool Container::addItem(Thing* th)
{
     if (numItems < maxSize)
     {
         contents[++numItems] = th;
         return true;
     }
else return false;
}
bool容器::addItem(Thing*th)
{
if(numItems
正如我前面提到的,调试监视显示“传递”的每个步骤都可以正常工作,除了最后的传递(容器的传递)。我做错了什么

注:ti在卧室内声明。它是一个由9个瓷砖组成的阵列,从0到8,组成“房间”。函数
makeNineSquare
只是一个在数组上实现二维链表的函数,创建指向相邻分幅的NESW指针。我这样创建它的原因是为了方便使用数组(如所提供的代码所示)放置在某些分幅上,并方便对象(如播放器)使用指针轻松遍历网格


这也允许全局通用移动命令(
moveN
只是
curr=curr->getN
,而不是一个计算来确定7是否与2相邻)。

根据你的代码,我不知道numitems是什么,但检查numitems++是否导致数组超出索引。

++numitems会给你一个问题。假设maxSize=10。numItems=9。if语句将正常运行,但numItems将增加到10,然后内容将在10取消引用。这就像声明一个大小为10的数组,并将其索引为10。只有0-9是正确的值。请将++numItems更改为numItems+,这可能会解决该问题。使用
vector
list
而不是C数组,使用所有这些神奇常量、一次性错误等。只需将新的元素插入容器中,就不必关心什么是“代码> NoMtase<代码>,什么时候更改它——这一切都将由C++自动为您完成。正如有害的
delete
所显示的那样,对于对象是什么,指向对象的指针是什么,以及它们的生命周期是什么,您似乎也非常犹豫。如果你不能弄清楚对象的所有权和生存期,那么你可能必须使用漂亮的介绍文章(通过谷歌翻译或类似服务阅读)。还有一个答案,表明
delete
在这里是有害的,杀死了对象,指向它的指针存储在
ti[3]
ti
的边界未知,使用
ti[3]
而不是
ti[0]
看起来对C代码有怀疑。该答案已被删除,但由于其中提出的观点是有效的,我想重复这些观点以供记录。numItems是容器对象中的项目数。无论使用什么构造函数,它在创建时都设置为0。
bool addItem(Thing* th);
bool Container::addItem(Thing* th)
{
     if (numItems < maxSize)
     {
         contents[++numItems] = th;
         return true;
     }
else return false;
}