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 を返しません。

これらすべてを修正すると、segfault なしでコンパイルおよび実行されるコードが得られます。

于 2011-04-10T12:01:47.287 に答える
0

コンパイラのバグ以外に問題の原因がわかりません。正確なコンパイラのバージョンを教えてください。

その間、次のことを試してみます。

  • intクラスにダミーメンバーを追加します。サイズがゼロのクラスが間違ったコード生成を引き起こす可能性があります。
  • Sub::test()virtual としても宣言します。繰り返しますが、ここでコンパイラが誤動作している可能性があります。

また、どのようなセグメンテーション違反が発生していますか? それは正確SIGSEGVですか、それとも別の信号ですか?デバッガーのバックトレースとローカル アセンブリ ダンプを提供していただけますか?

于 2011-04-11T07:10:59.380 に答える