虚函数调用分段错误

时间:2011-04-10 11:52:12

标签: c++ segmentation-fault virtual-functions vtable

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

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
 }

我已经尝试了几乎所有关于虚函数的知识但它不起作用。它实际上是一个更大的程序的一部分,所以它可能会有一些问题,但一旦我删除虚拟功能或停止使其虚拟它工作。任何想法?

还有任何工具或方法来检查vtable吗?

3 个答案:

答案 0 :(得分:0)

Class Sub不会继承Super类,因此它们与当前编写的内容无任何关联。

答案 1 :(得分:0)

这段代码可以编译吗?

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

将所有这些结果修复为编译并在没有段错误的情况下运行的代码。

答案 2 :(得分:0)

除了编译器错误之外,我没有看到可能导致问题的原因。你能给出确切的编译器版本吗?

与此同时,我会尝试以下方法:

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

另外,你得到了什么样的细分错误?它是SIGSEGV还是另一个信号?你能给一个调试器回溯和本地程序集转储吗?