虚函数调用分段故障

Virtual function invoking segmentation fault

本文关键字:故障 分段 函数调用      更新时间:2023-10-16

每当我试图访问虚拟函数时,我都会遇到分段错误。代码基本上是这样的:

class Super {
  public:
    Super() { cout << "Ctor Super" << endl; }
    virtual void test() = 0;
  };
class Sub : public Super {
  public:
    Sub() { cout << "Ctor Sub" << endl; }
    void test() { cout << "Test in Sub" << endl; }
  };
void main()
 {
   Super* s = new Sub;
   s->test(); // Segmentation fault So I tried the one below
   Sub* s1 = new Sub;
   s1->test(); //Still segmentation fault
   Sub s2;
   s2.test(); // Works fine BUT
   Super *s3 = &s2;
   s3->test(); // segmentation fault and EVEN
   Sub *s4 = &s2;
   s4->test(); //segmentation fault
 }

我几乎尝试了我所知道的关于虚函数的所有方法,但它不起作用。它实际上是一个更大的程序的一部分,所以它可能会有一些问题,但一旦我删除虚函数或停止使其虚函数,它就会工作。什么好主意吗?

还有什么工具或方法来检查虚表吗?

Sub类不继承Super类,因此它们在当前的编写中没有任何关系。

这段代码可以编译吗?

    所有的方法都是私有的。
  • Sub和Super之间没有继承。
  • 构造函数命名错误
  • main()函数不返回int。

除了编译器错误,我不知道是什么原因导致了这个问题。你能给出确切的编译器版本吗?

同时,我想尝试以下方法:

  • 在类中添加虚拟int成员。可能是零大小的类会导致错误的代码生成。
  • 也声明Sub::test()为虚的。同样,这里可能是编译器行为错误。

还有,你得到了什么样的分割错误?是SIGSEGV信号还是其他信号?您能提供调试器回溯和本地程序集转储吗?