Деструкторы в C++

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

12
задан JoeG 23 March 2010 в 17:43
поделиться

6 ответов

«Компилятор» ничего не удаляет. Он создает код, который делает что-то во время выполнения.

Когда вы пишете delete somePointer; , компилятор, по сути, пишет:

  if ( has_virtual_destructor( * somePointer  ) ) {
       // virtual dispatch to a compiler-generated function
      dynamic_cast< true_dynamic_type * >(somePointer)->destroy_dynamic_type();
       /* contents of true_dynamic_type::destroy_dynamic_type() {
              this->~true_dynamic_type();
              operator delete( this); // executed within class context
       } */
  } else {
      somePointer->~ClassName();
      operator delete(somePointer);
  }

Другими словами, вызывается деструктор, а затем вызывается оператор delete для освобождения памяти.

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

Обратите внимание, что оператор if верхнего уровня на самом деле не является частью сгенерированного кода; компилятор принимает это решение во время компиляции.

32
ответ дан 2 December 2019 в 04:25
поделиться

1) деструктор не принадлежит объекту, он принадлежит классу

2) Он вызывает деструктор для всех определенных пользователем типов (объектов класса) в своем классе.

3) Очистка - это необязательное действие, которое выполняется только в том случае, если оно действительно требуется

0
ответ дан 2 December 2019 в 04:25
поделиться

Память освобождается сразу после выхода из функции деструктора и перед возвратом выполнения к вызову «удаления» или точке, в которой экземпляр объекта выходит за пределы области видимости. Теоретически можно настроить другой диспетчер памяти для обработки новых и удаленных, но это было бы явным изменением поведения по умолчанию.

0
ответ дан 2 December 2019 в 04:25
поделиться

Более конкретно, в C++ никто, кроме программиста, не деаллоцирует память. Если объект находится на стеке, он является резидентным в пространстве памяти программы и занимает место в течение всего времени жизни программы. Если он находится на куче, то тот, кто создал объект, отвечает за его деаллокацию. Именно это делает delete . Это подводит нас к деструктору - если вы создаете объекты в своем классе, деструктор позволяет вам удалить их, когда класс выходит из области видимости. Это позволяет вам "выключить свет, когда вы уходите".

0
ответ дан 2 December 2019 в 04:25
поделиться

Деструкторы автоматически вызывают деструкторы для переменных-членов уничтожаемого объекта. Эти деструкторы могут освобождать память, а могут и не освобождать. Однако указатель не имеет деструктора или, если хотите, деструктор указателя ничего не делает. Он не освобождает память, на которую указывает. Если объект содержит указатель на объект, полученный из «new» или «malloc», программист этого объекта должен заставить деструктор поступать правильно. Вы должны запрограммировать деструктор на «удаление» или «освобождение» памяти, если она концептуально является частью разрушаемого объекта. Например, «векторный» объект обычно получает память из кучи, поскольку необходимый объем памяти обычно не известен во время компиляции. Эта память концептуально является частью векторного объекта, и, следовательно, программист векторного класса должен вызвать для нее команду «удалить» в деструкторе. Классы стандартной библиотеки шаблонов, такие как std :: vector, делают это правильно.

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

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

0
ответ дан 2 December 2019 в 04:25
поделиться

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

ОС будет сама освобождать объект после завершения деструктора.

2
ответ дан 2 December 2019 в 04:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: