Сообщение Re: Как удаляется vptr? от 10.04.2023 16:43
Изменено 10.04.2023 16:44 Marty
Re: Как удаляется vptr?
Здравствуйте, avovana, Вы писали:
Какая-то каша в голове.
vtbl — это статическая таблица (массив) указателей на методы класса, vptr — просто указывает на эту таблицу. Никакого удаления и создания не происходит. Если класс создаётся хотя бы единожды, то появляется ссылка на его vtbl и соответственно, она прилинковывается, иначе — нет.
Проблема с виртуальным деструктором в том, что если его нет, при удалении через указатель на базу производится вызов конкретного деструктора базового класса, и мемберы производного класса не будут корректно разрушены. Если в производном классе нет доп полей или они тривиальные, то программа в целом даже будет хромать и дальше. Если там что-то повеселее, хотя бы string или vector — то их деструкторы не будут вызваны и память будет утекать. Но причем тут vptr, и что подразумевается под его утечкой?
Какая-то каша в голове.
vtbl — это статическая таблица (массив) указателей на методы класса, vptr — просто указывает на эту таблицу. Никакого удаления и создания не происходит. Если класс создаётся хотя бы единожды, то появляется ссылка на его vtbl и соответственно, она прилинковывается, иначе — нет.
Проблема с виртуальным деструктором в том, что если его нет, при удалении через указатель на базу производится вызов конкретного деструктора базового класса, и мемберы производного класса не будут корректно разрушены. Если в производном классе нет доп полей или они тривиальные, то программа в целом даже будет хромать и дальше. Если там что-то повеселее, хотя бы string или vector — то их деструкторы не будут вызваны и память будет утекать. Но причем тут vptr, и что подразумевается под его утечкой?
Re: Как удаляется vptr?
Здравствуйте, avovana, Вы писали:
Какая-то каша в голове.
vtbl — это статическая таблица (массив) указателей на методы класса, vptr — просто указывает на эту таблицу. Никакого удаления и создания не происходит. Если класс создаётся хотя бы единожды, то появляется ссылка на его vtbl и соответственно, она прилинковывается, иначе — нет.
Проблема с виртуальным деструктором в том, что если его нет, при удалении через указатель на базу производится вызов конкретного деструктора базового класса, и мемберы производного класса не будут корректно разрушены. Если в производном классе нет доп полей или они тривиальные, то программа в целом даже будет хромать и дальше. Если там что-то повеселее, хотя бы string или vector — то их деструкторы не будут вызваны и память будет утекать. Но причем тут vptr, и что подразумевается под его утечкой?
ЗЫ А чего, в тиньке на плюсах пишут? По-моему, там Java изо всех дырок торчит. Что за вакансия, какая компенсация?
Какая-то каша в голове.
vtbl — это статическая таблица (массив) указателей на методы класса, vptr — просто указывает на эту таблицу. Никакого удаления и создания не происходит. Если класс создаётся хотя бы единожды, то появляется ссылка на его vtbl и соответственно, она прилинковывается, иначе — нет.
Проблема с виртуальным деструктором в том, что если его нет, при удалении через указатель на базу производится вызов конкретного деструктора базового класса, и мемберы производного класса не будут корректно разрушены. Если в производном классе нет доп полей или они тривиальные, то программа в целом даже будет хромать и дальше. Если там что-то повеселее, хотя бы string или vector — то их деструкторы не будут вызваны и память будет утекать. Но причем тут vptr, и что подразумевается под его утечкой?
ЗЫ А чего, в тиньке на плюсах пишут? По-моему, там Java изо всех дырок торчит. Что за вакансия, какая компенсация?