调用虚拟函数的覆盖导致分段故障。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了调用虚拟函数的覆盖导致分段故障。相关的知识,希望对你有一定的参考价值。

我正想覆盖一个函数,但最后却出现了分段故障。我遵循了一些教程,现在我无法找到分段故障的根源。

我使用了一个头文件和一个cpp文件。更新 原因是,我想做多个命令,如打印和实例化不同的命令,并调用执行方法,而不知道到底是什么命令。

这是在一个头文件声明。

  class Command{
    public:
     virtual int Execute(std::stack<NumericData>* stack)=0;
  };

  class Print : public Command{
    public:
     int Execute(std::stack<NumericData>* stack);
  };

这是一个cpp文件的实现。

 ... // inside some function
    std::stack<NumericData> stack;
    Command* command;
    if(1){                         // if is updated
        Print print;               // and reason for seg fault
        command=&print;            // without if it works
    }
    command->Execute(&stack); // <- segmentation fault
    ...

    int Command::Execute(std::stack<NumericData>* stack){
          printf("Execute parent
");
          return 0; 
    }

    int Print::Execute(std::stack<NumericData>* stack){
          printf("Execute child
");
          return 1;
    }
答案

这个问题与你的虚拟函数无关,也与覆盖无关。只是你使用了一个已经不存在的对象的地址。

在下面的代码块中

    Command* command;
    if(1){                         // if is updated
        Print print;               // and reason for seg fault
        command=&print;            // without if it works
    }
    command->Execute(&stack); // <- segmentation fault

在下面的代码块中 print 变量被限制在其包围的作用域内(即 { ...}). 因此,您分配给 command 当您离开该范围时,您的 command->Execute(&stack); 行试图去引用一个指向一个不再存在的对象的指针,导致分段故障。

以上是关于调用虚拟函数的覆盖导致分段故障。的主要内容,如果未能解决你的问题,请参考以下文章

装配分段故障恢复

QApplication 执行分段故障错误

为啥在此代码中调用虚拟方法时会出现分段错误?

确定导致分段错误的代码行?

使用一个参数调用 pthread_join 会导致分段错误?

访问全局数组会导致分段错误