【发布时间】:2020-11-28 03:56:50
【问题描述】:
刚上完第一堂 CS 课,我想更多地练习递归内存分配,所以我决定制作一个名为“Recursive Dungeon”的小游戏。它只是允许用户通过在每次玩家进入空(NULL)房间时递归生成一个新“房间”来在无限地牢中漫游。
然后新房间被保存,并且可以通过...访问。
- 沿着进入房间时使用的完全相同的路径前进
- 如果您离开房间,请原路返回同一房间
*该程序不使用循环(至少,我认为不会)。我不熟悉循环的概念以及如何使用它。
我遇到的问题是,当我尝试清理所有递归分配的内存(“房间”)时,我收到经典错误“分段错误:核心转储”。
下面是我的结构“房间”:
struct room
{//begin struct
room* backward;
room* left;
room* forward;
room* right;
string desc;
room() { //begin
backward = NULL;
left = NULL;
forward = NULL;
right = NULL;
/*End*/}
/*End struct*/};
每个“房间”都与其他房间相连(左/右/前/后)。用户从空房间指针“起点”开始,并且可以朝上述任何方向前进。在尝试进入空(NULL)房间时,会随机生成一个新房间供用户进入。
一旦玩家对探索感到满意,我会尝试在结束程序之前使用一个存储所有房间的数组来清理分配的内存。相反,它会导致分段错误。代码如下:
void ClearAllocatedMemory(room* aRoom, room** roomArray, int& raIndex) {
for(short i=0; i<raIndex; i++) {//begin for
delete roomArray[i];
/*End for*/}
delete[] roomArray;
/*End func*/}
这是创建我的数组并定义其第一个(第 0 个)索引的代码:
room** roomArray;
int raIndex = 0;
room* startingpoint = new room();
roomArray[0] = startingpoint;
这是在新房间中添加到roomArray 索引的代码:
room* GenRoom(room** roomArray, int& raIndex) {
room* newroom = new room();
newroom->desc = GenRoomDesc( rand()%12 + 1 );
raIndex++;
roomArray[raIndex] = newroom;
return newroom;
}
【问题讨论】:
-
"cmets 关于如何...提高清晰度/格式" 第一步:从代码中删除空行,它们占用大量空间。
-
你能到达你已经住过的房间吗?您可以在不回溯步骤的情况下这样做吗(即图中是否有任何循环)?
-
我想
room->left->right就是这样一个循环,这就是所提供的代码有问题。 -
@john 我的意思是像 left->left->left->left 这样的非平凡循环
-
我认为递归和手动内存管理并不是最好的方法。您应该将房间存储在一个数据结构中,这样您就可以有效地执行所需的操作。我不明白你为什么要使用递归,因为这个问题本质上不是递归的。
标签: c++ recursion memory segmentation-fault c++17