Следующая программа вызывает ошибку сегментации.
При печати я увидел, что перед сбоем 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>
[list] [*]Следующая программа вызывает ошибку сегментации. При печати я увидел, что перед сбоем Dtor не вызывается.
[*]В gdb я увидел, что каждый объект Y содержит указатель на свою виртуальную таблицу. Поэтому при попытке удалить объект программа будет искать Dtor в виртуальной таблице Y.
[*]Однако мы используем указатель X на объект Y -
< li>Итак, моя теория заключается в том, что программа пытается получить доступ к записи в vtable Y, соответствующей Dtor X, потому что (и это то, для чего я пытаюсь получить подтверждение) она вычисляет смещение (от начала vtable) [b]используя имя функции[/b] («~X», потому что указатель имеет тип X), и это приводит к попытке доступа к недопустимому адресу. < /li> [*]Итак, вопрос в том, как рассчитывается смещение от начала виртуальной таблицы? это действительно из названия функции?
[*]Пожалуйста, дайте мне знать, что вы думаете, и если я говорю полную ерунду, пожалуйста, поправьте мне XD
[*]Спасибо большое :)
[/list][code]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; } [/code] И еще 2 вещи, которые я пытаюсь выяснить: [list] [*]Почему, когда я меняю тип m_b для удвоения (или любых других типов длиной 8 байт) программа не аварийно завершает работу?
[*]Почему, когда я делаю Dtor X также невиртуальным программа не аварийно завершает работу?
p.s - я использую C++ 98 с компилятором g++. < /li> [/list]
Я работаю над кодом Python, включающим две камеры (камеру Flir и Logitech), и я использую USB-реле для управления освещением для каждой камеры и получаю эту ошибку внутри motion_start. Реле 1 включается, но потом появляется ошибка. Я прикрепил блок...
Я работаю над кодом Python, включающим две камеры (камеру Flir и Logitech), и я использую USB-реле для управления освещением для каждой камеры и получаю эту ошибку внутри motion_start. Реле 1 включается, но потом появляется ошибка. Я прикрепил блок...
Я работаю над кодом Python, включающим две камеры (камеру Flir и Logitech), и я использую USB-реле для управления освещением для каждой камеры и получаю эту ошибку внутри motion_start. Реле 1 включается, но потом появляется ошибка. Я прикрепил блок...
Раньше я считал, что программа сразу выйдет из строя при разыменовании нулевого указателя.
Но фрагмент кода ниже работает хорошо. Какой сюрприз!
#include
#include