C++ 随机分段故障

C++ 随机分段故障,c++,c,segmentation-fault,C++,C,Segmentation Fault,我正在做一个游戏。在某些地方,有时我会收到分段错误,而在所有其他时间,代码都正常工作。如果我再次运行游戏(在收到分段错误后),它会恢复(没有任何代码更改)并正常运行。但过了一段时间,这种情况再次发生 我试着用GDB调试它。我得到了以下信息: 有一个函数调用:func(&s.x),其中s是一个结构,x是其int类型的成员。地址(&s.x)是0xb3456721 在函数func中,参数中接收的值为0xb 程序崩溃,表示无法访问0xb处的内存。当我使用GDB打印变量时,我再次收到无法访问的内存 知道为

我正在做一个游戏。在某些地方,有时我会收到分段错误,而在所有其他时间,代码都正常工作。如果我再次运行游戏(在收到分段错误后),它会恢复(没有任何代码更改)并正常运行。但过了一段时间,这种情况再次发生

我试着用GDB调试它。我得到了以下信息:

  • 有一个函数调用:func(&s.x),其中s是一个结构,x是其int类型的成员。地址(&s.x)是0xb3456721
  • 在函数func中,参数中接收的值为0xb
  • 程序崩溃,表示无法访问0xb处的内存。当我使用GDB打印变量时,我再次收到无法访问的内存

  • 知道为什么会发生这种情况吗?

    当给定的相同输入中有不确定的数据源时,程序有时会崩溃,但其他时候不会。通常源是一个未初始化的变量或内存块,但它可能依赖于时间戳、进程ID或来自系统的其他不同输入源。

    一个程序,当给定的相同输入中有一个不确定的数据源时,该程序有时会崩溃,但有时不会崩溃。通常,源是一个未初始化的变量或内存块,但它可能依赖于时间戳、进程ID或来自系统的其他输入源,因为C++标记存在,但是您在说您正在调用的函数是:<代码> FUNC(& Sx)< /代码>,然后考虑到
    func
    在其参数中表示它收到了
    0xb
    ,参数使我相信
    s
    实际上是一个未正确初始化的引用。例如,考虑:

    struct foo {
        char a[12];
        int x;
    };
    
    void func (int *x) {
        *x = 0;
    }
    
    int main () {
        foo *sp = (foo *)-1;
        foo &s = *sp;
        func(&s.x);
    }
    

    <> P>不可能诊断你的问题的确切性质,因为你没有提供足够的信息。

    因为C++标签存在,但是你在说你正在调用函数:<代码> FUNC(& SX)< /C>然后考虑到

    func
    在其参数中表示它收到了
    0xb
    ,参数使我相信
    s
    实际上是一个未正确初始化的引用。例如,考虑:

    struct foo {
        char a[12];
        int x;
    };
    
    void func (int *x) {
        *x = 0;
    }
    
    int main () {
        foo *sp = (foo *)-1;
        foo &s = *sp;
        func(&s.x);
    }
    
    因为您没有提供足够的信息,所以无法诊断问题的确切性质。

    我以前在Linux上成功地使用过调试未初始化变量导致的非确定性行为

    这是我使用的
    valgrind
    命令,您的程序和选项应该遵循

    valgrind --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=20 --track-fds=yes --track-origins=yes -v 
    
    如果您在Windows上运行,请查看
    valgrind
    替代品的答案

    你的程序是多线程的吗?非确定性的一个来源是。

    我以前在Linux上成功地使用过调试由未初始化变量引起的非确定性行为

    这是我使用的
    valgrind
    命令,您的程序和选项应该遵循

    valgrind --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=20 --track-fds=yes --track-origins=yes -v 
    
    如果您在Windows上运行,请查看
    valgrind
    替代品的答案


    你的程序是多线程的吗?非确定性的一个来源是一个。

    代码,或者它没有发生。如果有代码,我们会有更多的想法。你必须在你认为失败的地方共享一些代码。程序崩溃,表示0xb的内存无法访问。这正是SegFault的原因。您的代码试图在其允许的段之外写入。当您尝试取消对未初始化指针或悬空指针的引用时,可能会发生这种情况。我敢打赌
    偏移(S,x)
    0xb
    ,就像
    func
    中看到的地址一样。这意味着在某个地方取消了对空指针的引用。代码或它没有发生。如果有代码,我们会有更多的想法。您必须在您认为失败的地方共享一些代码。程序崩溃,表示无法访问0xb的内存。这正是SegFault的原因。您的代码试图在其允许的段之外写入。当您尝试取消对未初始化指针或悬空指针的引用时,可能会发生这种情况。我敢打赌
    偏移(S,x)
    0xb
    ,就像
    func
    中看到的地址一样。这意味着在某个地方取消了对空指针的引用。