2

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

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 吗?

4

3 回答 3

0

Sub 类不继承自 Super 类,因此它们与当前编写的方式没有任何关系。

于 2011-04-10T12:00:44.847 回答
0

这段代码可以编译吗?

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

修复所有这些会导致代码在没有段错误的情况下编译和运行。

于 2011-04-10T12:01:47.287 回答
0

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

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

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

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

于 2011-04-11T07:10:59.380 回答