【问题标题】:Virtual function invoking segmentation fault虚函数调用分段错误
【发布时间】:2011-08-02 11:09:09
【问题描述】:

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

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

【问题讨论】:

  • 代码在这里构建并运行良好。
  • 是的,它应该,但它不在我的机器上。我在 LYnxOS powerPC 机器上运行它。你能想到它不应该运行的任何情况吗?

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这段代码可以编译吗?

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

    修复所有这些导致代码编译和运行时没有段错误。

    【讨论】:

    • 是的,这段代码可以编译并执行。这就是我遇到段错误的原因。它是一个 c++ 代码,我认为您将它与其他语言(可能是 java ......)混淆了。无论如何,如果你找到了一些帮助......干杯。
    • 当我(和乔)回答时,代码看起来不像现在的样子。前三点已经确定。它仍然是无效的 C++,因为 main() 应该返回 int (stackoverflow.com/questions/204476/…),但这不能证明段错误是合理的。
    【解决方案3】:

    除了编译器错误,我看不出是什么导致了这个问题。能否给出确切的编译器版本?

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-26
      • 1970-01-01
      • 2020-04-04
      • 1970-01-01
      • 1970-01-01
      • 2013-03-31
      相关资源
      最近更新 更多