Виртуальная функция, вызывающая ошибку сегментации - PullRequest
2 голосов
/ 10 апреля 2011

Я получаю ошибку сегментации, когда пытаюсь получить доступ к виртуальной функции.Код в основном такой:

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 голосов
/ 10 апреля 2011

Может ли этот код компилироваться вообще?

  • Все ваши методы являются закрытыми.
  • Нет наследования между Sub и Super.
  • Конструктор ошибоченnamed.
  • Функция main () не возвращает int.

Исправление всех этих результатов в коде, который компилируется и выполняется без ошибки segfault.

0 голосов
/ 11 апреля 2011

Я не вижу, что может вызвать проблему, кроме ошибки компилятора.Можете ли вы дать точную версию компилятора?

Тем временем я бы попробовал следующее:

  • добавить фиктивный член int в классы.Возможно, класс нулевого размера вызывает неправильную генерацию кода.
  • также объявляет Sub::test() как виртуальный.Опять же, может быть, здесь компилятор ведет себя неправильно.

Кроме того, какой тип ошибки сегментации вы получаете?Это точно SIGSEGV или это другой сигнал?Не могли бы вы дать отладчику обратную трассировку и дамп локальной сборки?

0 голосов
/ 10 апреля 2011

Class Sub не наследуется от класса Super, поэтому они никак не связаны, как написано в настоящее время.

...