Информация об изменениях

Сообщение Re: Как удаляется vptr? от 10.04.2023 16:43

Изменено 10.04.2023 16:44 Marty

Re: Как удаляется vptr?
Здравствуйте, avovana, Вы писали:

Какая-то каша в голове.

vtbl — это статическая таблица (массив) указателей на методы класса, vptr — просто указывает на эту таблицу. Никакого удаления и создания не происходит. Если класс создаётся хотя бы единожды, то появляется ссылка на его vtbl и соответственно, она прилинковывается, иначе — нет.

Проблема с виртуальным деструктором в том, что если его нет, при удалении через указатель на базу производится вызов конкретного деструктора базового класса, и мемберы производного класса не будут корректно разрушены. Если в производном классе нет доп полей или они тривиальные, то программа в целом даже будет хромать и дальше. Если там что-то повеселее, хотя бы string или vector — то их деструкторы не будут вызваны и память будет утекать. Но причем тут vptr, и что подразумевается под его утечкой?
Re: Как удаляется vptr?
Здравствуйте, avovana, Вы писали:

Какая-то каша в голове.

vtbl — это статическая таблица (массив) указателей на методы класса, vptr — просто указывает на эту таблицу. Никакого удаления и создания не происходит. Если класс создаётся хотя бы единожды, то появляется ссылка на его vtbl и соответственно, она прилинковывается, иначе — нет.

Проблема с виртуальным деструктором в том, что если его нет, при удалении через указатель на базу производится вызов конкретного деструктора базового класса, и мемберы производного класса не будут корректно разрушены. Если в производном классе нет доп полей или они тривиальные, то программа в целом даже будет хромать и дальше. Если там что-то повеселее, хотя бы string или vector — то их деструкторы не будут вызваны и память будет утекать. Но причем тут vptr, и что подразумевается под его утечкой?


ЗЫ А чего, в тиньке на плюсах пишут? По-моему, там Java изо всех дырок торчит. Что за вакансия, какая компенсация?