gpt4 book ai didi

c - 清理程序时出现段错误

转载 作者:太空宇宙 更新时间:2023-11-04 02:47:51 25 4
gpt4 key购买 nike

我是 C 的新手,我一直在阅读 Zed Shaw 的“艰难地学习 C”。我有其他语言的经验,但主要是处理自己的内存管理的语言,所以我对其中的一些是新的。我构建了 this lesson. 中描述的游戏并稍微扩展它,这样我就可以在一个类中定义游戏机制并在另一个类中构建 map 。我正在尝试构建函数来处理内存管理并释放程序分配的所有堆内存,但我的程序在清理时导致段错误。

我已经定义了一个基于对象父类(super class)的房间对象,如下所示:

struct Room {
Object proto;

Monster *bad_guy;

struct Room *north;
struct Room *south;
struct Room *east;
struct Room *west;
};

typedef struct Room Room;

Object RoomProto;

我在 map 被销毁时调用了这个方法。根据 valgrind 的说法,该程序在破坏 room->north 的线路上导致了段错误。我的想法是,我会检查房间是否存在,如果存在则销毁它,这样我就可以遍历所有 map 并删除每个房间,但不会尝试释放任何 NULL 指针。

void Room_destroy(void *self)
{
Room *room = self;


if(room){
if(room->north){
room->north->_(destroy)(room->north);
}
if(room->south){
room->south->_(destroy)(room->south);
}
if(room->west){
room->west->_(destroy)(room->west);
}
if(room->east){
room->east->_(destroy)(room->east);
}
if(room->bad_guy){
room->bad_guy->_(destroy)(room->bad_guy);
}
room->_(destroy)(room);
}
}

我尝试通过多种方式自己解决问题,例如首先将指针分配给 null,例如: 房间 *n = NULL; n = 房间-> 北;然后检查 n,而不仅仅是房间-> 北。我知道这是一个常见错误,所以我觉得我可能只是遗漏了一些关于指针的关键点,这不是双关语。

最佳答案

好的,看来您提供的链接是在 C 中实现 OOP。这很糟糕。如果你正在尝试学习 C,那么最好先尝试了解基础知识。这只会让您感到困惑。

现在谈到您的代码。我试图理解,这似乎是问题所在。你在做

if(room->north){
room->north->_(destroy)(room->north);
}
...

您正在调用作为参数传递的同一对象的销毁函数。所以你在你想要释放的内存中。如果你想这样做,那就去做吧

if(room->north){
room->_(destroy)(room->north);
}
...

我认为这不会导致任何段错误。

还有一点小建议。不要混淆 OOP 和 C。否则,您将一直面临此类问题。

关于c - 清理程序时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25465589/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com