Что происходит при выделения памяти под объект класса?

230
19 сентября 2017, 08:35

Допустим, есть у меня класс BaseA. У него есть виртуальные и статические методы, а так же конструктор с деструктором.
Когда я делаю выделение памяти BaseA *a = new BaseA();, как я понимаю создаётся таблица виртуальных методов, в которую записываются все виртуальные функции класса. Туда же, как я понял, записывается и конструктор по-умолчанию.
А куда записываются статические методы, деструктор и другие конструкторы?

Answer 1

Во-первых эта таблица это всего лишь указатель vptr на статический массив из указателей на функции, поэтому туда только указатели на функции и будут ... а не "сами функции".

Статические методы это глобальные для данного класса функции, которые доступны всем через идентификатор класса Base::MyStaticMethod(); - следовательно их не имеет смысла записывать в эту таблицу.

А указатели на деструкторы должны будут оказаться в этой таблице, иначе, например, деструктор производного класса не вызывался бы при удалении объекта через указатель на базовый - т.е. в такой ситуации

Base* bp = new Derived();
delete bp;

произошла бы утечка памяти

Answer 2

Таблица создается еще при компиляции. При создании объекта в него добавляется указатель на эту таблицу (одну для всех объектов данного класса).

Невиртуальные методы никуда не "записываются", так как еще на этапе компиляции известно, когда они вызываются, так что выполняется просто вызов указанного метода. Например, куда записывается, ну, скажем, функция sin или printf? Вот туда же записываются и невиртуальные методы...

READ ALSO
QFileDialog имя расположение файла char*

QFileDialog имя расположение файла char*

При вызове QFileDialog::getOpenFileName, и попытке преобразования QString в char* или же const char*, происходит либо потеря данных, или что-то еще нехорошее, и VLC отказывается...

295
Написать и вызвать функцию с переменным количеством параметров

Написать и вызвать функцию с переменным количеством параметров

Задача есть, нужно отдельно задать функцию со сменным числом параметров, а потом ее вызвать

242
Одно действие по двум событиям в jQuery

Одно действие по двум событиям в jQuery

ajax запрос вызывается по двум действиям:

210