C++ — пытаюсь понять виртуальные функции, виртуальные таблицы и почему эта программа выделяет ошибки.C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 C++ — пытаюсь понять виртуальные функции, виртуальные таблицы и почему эта программа выделяет ошибки.

Сообщение Anonymous »

  • Следующая программа вызывает ошибку сегментации.
    При печати я увидел, что перед сбоем Dtor не вызывается.
  • В gdb я увидел, что каждый объект Y содержит указатель на свою виртуальную таблицу.
    Поэтому при попытке удалить объект программа будет искать Dtor в виртуальной таблице Y.
  • Однако мы используем указатель X на объект Y -

    < li>Итак, моя теория заключается в том, что программа пытается получить доступ к записи в vtable Y, соответствующей Dtor X, потому что (и это то, для чего я пытаюсь получить подтверждение) она вычисляет смещение (от начала vtable) используя имя функции («~X», потому что указатель имеет тип X), и это приводит к попытке доступа к недопустимому адресу.
    < /li>
  • Итак, вопрос в том, как рассчитывается смещение от начала виртуальной таблицы? это действительно из названия функции?
  • Пожалуйста, дайте мне знать, что вы думаете, и если я говорю полную ерунду, пожалуйста, поправьте мне XD
  • Спасибо большое :)

Код: Выделить всё

class X
{
public:
virtual ~X() {}

private:
double m_a;
};

class Y: public X
{
private:
int m_b;
};

int main()
{
X *xp = new Y[5];
delete[] xp;

return 0;
}
И еще 2 вещи, которые я пытаюсь выяснить:
  • Почему, когда я меняю тип m_b для удвоения (или любых других типов длиной 8 байт) программа не аварийно завершает работу?
  • Почему, когда я делаю Dtor X также невиртуальным программа не аварийно завершает работу?

    p.s - я использую C++ 98 с компилятором g++.
    < /li>


Подробнее здесь: https://stackoverflow.com/questions/791 ... oes-this-p
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»