C++ 在哪里查找分段错误?

C++ 在哪里查找分段错误?,c++,segmentation-fault,C++,Segmentation Fault,我的程序有时只会出现一个分段错误:11,我一辈子都搞不清楚。在C++和指针领域我不知道很多,所以我应该寻找什么样的东西? 我知道这可能与我正在使用的一些函数指针有关 我的问题是什么样的事情会产生分割错误?我在这件事上迷失了方向,我已经看过了所有我认为可能导致这件事的代码 我使用的调试器是lldb,它显示了此代码段中的错误: void Player::update() { // if there is a smooth animation waiting, do this one

我的程序有时只会出现一个
分段错误:11
,我一辈子都搞不清楚。在C++和指针领域我不知道很多,所以我应该寻找什么样的东西? 我知道这可能与我正在使用的一些函数指针有关

我的问题是什么样的事情会产生分割错误?我在这件事上迷失了方向,我已经看过了所有我认为可能导致这件事的代码

我使用的调试器是lldb,它显示了此代码段中的错误:

void Player::update() {
    // if there is a smooth animation waiting, do this one
    if (queue_animation != NULL) {
        // once current animation is done,
        // switch it with the queue animation and make the queue NULL again
        if (current_animation->Finished()) {
            current_animation = queue_animation;
            queue_animation = NULL;
        }
    }
    current_animation->update(); // <-- debug says program halts on this line
    game_object::update();
}
这没有任何帮助,因为我有时仍然会出现分割错误

编辑2:

将代码修改为:

void播放器::更新(){
//如果有平滑动画正在等待,请执行此操作
如果(是队列动画){
std::cout update();
游戏对象::更新();
}
只是想看看这个函数什么时候会在没有任何用户输入的情况下输出。每次我遇到分段错误时,它都会在错误发生之前输出两次。这是我的调试输出:


*线程#1:tid=0x1421bd4,0x0000000000000000,队列='com.apple.main-thread,停止原因=EXC#u坏访问(代码=1,地址=0x0)
帧0:0x0000000000000000
错误:0x0的内存读取失败

使用您的软件运行valgrind(警告,它确实会减慢速度)。很可能内存已被某种方式覆盖。valgrind(和其他工具)可以帮助跟踪其中一些问题,但不是所有问题

如果是一个大型程序,这可能会变得非常困难,因为一切都是可疑的,因为任何东西都可能损坏内存中的任何东西。您可以尝试通过某种方式限制程序来最小化运行的代码路径,并查看是否可以使问题发生。这有助于减少可疑代码的数量

如果以前版本的代码没有问题,请查看是否可以恢复到该版本,然后查看更改的内容。如果您使用的是git,它可以将搜索平分到第一次出现故障的版本中

警告,这种事情是C/C++开发人员的祸根,这也是Java等语言“更安全”的原因之一


您可以开始查看代码,看看是否可以找到可疑的东西,包括可能的比赛条件。希望这不会花费太多时间。我不想吓到您,但这些类型的错误可能是最难追踪的错误之一。

分段错误的一些原因:

  • 取消引用未初始化或指向NULL的指针
  • 取消对已删除指针的引用
  • 您在分配内存的范围之外写入(例如,在数组的最后一个元素之后)

  • 可能是内存损坏?您能在调试器中尝试并给我们提供精确的代码来查找尚未分配的指针或已被覆盖的传统数组吗?分段错误通常意味着您的程序在不属于它的内存中编写。一方面,您声明“找到了程序停止的确切行”,另一方面,你说,“我甚至不确定哪个文件包含错误的代码行"如果你知道引起问题的那条线,那么请在这里发布相关的代码。请把调试器的代码确定为问题所在,否则你的问题是无法回答的。请编辑你的问题,不要有矛盾。因为这是我第一次用C++编程。大约两周前。”-这是你的问题!:)遗憾的是,这些都不是问题。我所有问题的根源都是一个未初始化的指针!谢谢你更新了答案。
    void Player::update() {
        // if there is a smooth animation waiting, do this one
        if (is_queue_animation) {
            // once current animation is done,
            // switch it with the queue animation and make the queue NULL again
            if (current_animation->Finished()) {
                current_animation = queue_animation;
                is_queue_animation = false;
            }
        }
        current_animation->update();
        game_object::update();
    }