【问题标题】:Calling override of virtual function is causing a segmentation fault调用虚函数的覆盖导致分段错误
【发布时间】:2020-09-26 17:46:01
【问题描述】:

我试图重写一个函数,但最终出现分段错误。我遵循了一些教程,但现在我无法找到分段错误的根源。

我使用 1 个标头和 1 个 cpp 文件。 更新原因是我想制作多个命令,例如打印并实例化不同的命令并调用 Execute 方法,而不知道这是什么命令。

这是在一个头文件中声明的:

  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\n");
          return 0; 
    }

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

【问题讨论】:

  • 如果Command::Execute 是纯虚拟的,你为什么要定义它?
  • @cigien ,我想要从 Command 类继承的多个命令并实现不同的执行功能,这样我就可以有不同的命令,我不需要确切知道我可以使用哪个命令执行方法执行命令
  • 请将此信息添加到问题中,并查看@churill 关于制作 mre 的评论。
  • 在mre上工作

标签: c++ overriding header-files virtual


【解决方案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-&gt;Execute(&amp;stack); 行正试图取消引用指向不再存在的对象的指针,从而导致分段错误。

【讨论】:

  • 谢谢,我应该改问题标题以避免混淆吗?
  • @Thegabagabor 我改了标题,但也许你想改一下?
  • 谢谢,我真的不知道什么是好标题,所以我就保持现在的样子
猜你喜欢
  • 1970-01-01
  • 2010-12-03
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-30
  • 1970-01-01
相关资源
最近更新 更多