对象列表的分段错误问题

Segmentation fault problem with object lists

提问人:guerro 提问时间:10/7/2023 更新时间:10/8/2023 访问量:48

问:

我正在做一个C++项目,一个非常简单的视频游戏。这个游戏必须有无限的关卡,每个关卡都有随机数量的平台。 我为平台创建了一个对象,这里是 hpp:

class platform {
protected:
    hitBox box;
public:
    platform (int a, int b, int c, int d);
    void print();
    hitBox getHitbox();
};

以及关卡的一个对象,其中包含平台列表,因为每个级别的平台数量都可以更改,这里是 HPP:

struct Pplatform {
    platform* plat;
    Pplatform* next;
};
typedef Pplatform* lPlatform;

hitBox newRandomPlat (hitBox where);

class level {
protected:
    int nlevel;                
    lPlatform platforms;           
public:
    level (int nl, bulletManager* bM);
    void print_platforms ();
    infoCrash check (hitBox ht, char d);  
    int lnumber ();                       
};

但是在级别 .cpp 中,当我在列表中创建平台对象时,我有分段错误:

this->platforms->plat = new platform (0, 1, COLS, 0);

这一行给了我分割错误,我试着用不同的方式写它,这样:

platform plt = platform (0, 1, COLS, 0);
this->platforms->plat = &plt ;

但这行不通。你能帮帮我吗?谢谢

C++ 列表 对象 指针 segmentation-fault

评论

0赞 Brian61354270 10/7/2023
你在哪里分配内存,指向那个?Pplatformlevel::platforms
2赞 Quimby 10/7/2023
请创建一个最小的可重现示例,您是否尝试过使用调试器来检查段错误?它将向您展示究竟是什么原因造成的。
1赞 drescherjm 10/7/2023
this->platforms->plat = &plt ;请记住,the 获取局部变量的地址,但不会以任何方式延长其生存期。当超出范围时,将指向无效地址。&pltthis->platforms->plat
2赞 drescherjm 10/7/2023
从您显示的代码来看,您的错误似乎尚未分配。所以你不能做哪里是指针。platformsthis->platforms->plat = anylocationanylocation
1赞 Jesper Juhl 10/8/2023
幸运的是,分段错误(段错误)是调试器最容易捕获和诊断的问题之一。你调试过你的程序了吗?当你遇到段错误时,你的调试器告诉你什么?堆栈跟踪是什么样的?在发生问题的堆栈帧中,相关变量的值是多少?

答:

1赞 TanyacShiv 10/7/2023 #1

您遇到的分段问题很可能是由于访问未正确分配的内存引起的。您正在尝试在代码中设置一个值,但似乎尚未为 分配内存。this->platforms->platthis->platforms

您可以尝试使用平台成员的关卡构造函数的以下修订代码:

level::level(int nl, bulletManager* bM) : nlevel(nl), platforms(nullptr) {
    
}

构建新平台时,必须为其动态分配内存并更新平台列表。