Зачем вызывать деструктор объекта по умолчанию перед освобождением памяти, выделенной этому объекту? - PullRequest
0 голосов
/ 21 июня 2019

Я видел, как какой-то код выполняет следующее:

ExampleObject< T > * eo = const_cast< ExampleObject< T > * >(this);
eo->~ExampleObject();
free( eo );

Данный объект ExampleObject был размещен с использованием позиции new.Деструктор не определен пользователем, поэтому здесь используется деструктор, предоставленный компилятором по умолчанию, я думаю.

Я не понимаю, зачем здесь вызывать деструктор.Если бы у нас был определяемый пользователем деструктор, который распределял память для некоторых его членов класса, я мог бы понять использование здесь, но в случае деструктора по умолчанию я не знаю, почему мы сделали бы это.

Что делает деструктор объекта по умолчанию, который потребовал бы, чтобы мы вызвали его перед освобождением выделенной памяти для объекта?

Ответы [ 3 ]

4 голосов
/ 21 июня 2019

Что делает деструктор объекта по умолчанию

Он вызывает деструкторы, если таковые имеются, для членов данных объекта.

что потребовало бы, чтобы мы вызвали его перед освобождением выделенной памяти для объекта?

ЕДИНСТВЕННЫЙ раз, когда деструктор должен когда-либо вызываться явно , это когда объект был построен с использованием placement-new внутри существующего блока памяти. Использование placement-new отделяет задачи построения / разрушения объекта от выделения / освобождения памяти, поэтому вам нужно явно создавать и уничтожать объект, но вам не нужно выделять / освобождать его блок памяти, вы можете управлять этим так, как хотите в другом месте.

Если вы не используете placement-new для создания объекта, а вместо этого выделяете + конструируете объект, используя new, тогда вы должны уничтожить + освободить объект, используя delete (и вы должны предпочтительно использовать умный указатель , std:unique_ptr или std::shared_ptr, чтобы справиться с этим для вас).

Если вы не строите объект с использованием какой-либо формы new, то НЕ пытайтесь вообще уничтожить объект вручную. Объект находится в автоматическом хранилище , и компилятор будет управлять им за вас.

1 голос
/ 21 июня 2019

Функции размещения C ничего не знают об объектах C ++.В отличие от new и delete, которые выделяют необходимую память и вызывают конструктор / деструктор, все функции C делают это для выделения / освобождения необходимого размера памяти, которую вы можете использовать.

Поэтому, когда вы используетефункции C, вы должны вызывать функцию выделения, чтобы получить память, вызывать новое размещение для нее, чтобы фактически построить объект в памяти (это необходимо для того, чтобы фактически иметь объект этого типа).Затем, когда вы закончите с этим, вам нужно уничтожить объект, вручную вызвав деструктор (вы должны сделать это, чтобы правильно завершить время жизни объектов), а затем передать указатель на свободный, чтобы освободить память.

Вот почему вы не должны использовать *alloc и free в C ++.Они требуют много дополнительной работы и небезопасны.

0 голосов
/ 22 июня 2019

Функция деструктора по умолчанию вызывается автоматически, когда объект выходит из области видимости:

  1. Функция заканчивается
  2. Программа заканчивается
  3. Блок, содержащий локальные переменные, заканчивается
  4. Оператор удаления называется

Деструктор по умолчанию всегда вызывает деструкторы своих объектов-членов (не для переменных-членов, которые являются указателями на объекты). Если мы выделяем память динамически, это должно быть обработано нами, в противном случае деструктор по умолчанию очищает локальные переменные.

Если мы не напишем наш собственный деструктор в классе, компилятор создаст для нас деструктор по умолчанию. Деструктор по умолчанию работает нормально, если у нас нет динамически выделенной памяти или указателя в классе. Когда класс содержит указатель на память, выделенную в классе, мы должны написать деструктор, чтобы освободить память до того, как экземпляр класса будет уничтожен. Это необходимо сделать, чтобы избежать утечки памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...