Пространства имён
Варианты
Действия

Destructors

Материал из cppreference.com
< cpp‎ | language

 
 
Язык С++
Общие темы
Управление программой
Операторы условного выполнения
Операторы повторения
Операторы перехода
Функции
объявление функции
объявление лямбда-функции
шаблон функции
спецификатор inline
спецификаторы исключений (устарело)
спецификатор noexcept (C++11)
Исключения
Пространства имён
объявление пространства имён
псевдонимы пространства имён
Типы
спецификатор decltype (C++11)
Спецификаторы
cv-спецификаторы
спецификаторы продолжительности хранения
спецификатор constexpr (C++11)
спецификатор auto (C++11)
спецификатор alignas (C++11)
Инициализация
Литералы
Выражения
Утилиты
Типы
typedef-объявление
объявление псевдонима типа (C++11)
атрибуты (C++11)
Приведения типов
неявные преобразования
const_cast-преобразование
static_cast-преобразование
dynamic_cast-преобразование
reinterpret_cast-преобразование
C-подобное и функциональное приведение типов
Выделение памяти
Классы
Особые свойства классовых функций
Специальные функции-члены
Шаблоны
шаблон класса
шаблон функции
специализация шаблона
упакованные параметры (C++11)
Разное
Ассемблерные вставки
 

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

Содержание

[править] Синтаксис

~class_name (); (1)
virtual ~class_name (); (2)
~class_name () = default; (3) (начиная с C++11)
~class_name () = delete; (4) (начиная с C++11)

[править] Пояснения

  1. Типичное объявление деструктора
  2. Виртуальный деструктор обычно требуется в базовом классе
  3. Принудительная деструктор порождается компилятором
  4. Отключение неявной деструктор

Деструктор вызывается при уничтожении объекта, происходящем при

  • завершение программы для статических объектов
  • выходе из функции для локальных объектов
  • конец сферы, для объектов с автоматической продолжительности хранения и временных, чья жизнь была расширена путем связывания с ссылкой
    Оригинал:
    end of scope, for objects with automatic storage duration and for temporaries whose life was extended by binding to a reference
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • при удалении объекта в динамической памяти
  • при завершении выражения для временных объектов
  • раскручивание стека, для объектов с автоматической срок хранения, когда исключение ускользает от их блока, неперехваченного.
    Оригинал:
    stack unwinding, for objects with automatic storage duration when an exception escapes their block, uncaught.
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

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

[править] Неявный деструктор

Если нет заданного пользователем деструктора, компилятор создаст свой деструктор как inline public член класса.

[править] Удаленные неявно объявлена ​​копия деструктор

Неявно объявлен дефолт или деструктора для класса T не определено (до C++11) / определяется как' (начиная с C++11) удален, если любое из следующих условий:
Оригинал:
The implicitly-declared or defaulted destructor for class T is undefined (до C++11) / defined as deleted (начиная с C++11) if any of the following is true:
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • T имеет не статические данные члены, которые не могут быть уничтожена (удалил или недоступных деструктора)
    Оригинал:
    T has a non-static data member that cannot be destructed (has deleted or inaccessible destructor)
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • T имеет прямое или виртуальный базовый класс, который не может быть уничтожена (удалил или недоступных деструкторов)
    Оригинал:
    T has direct or virtual base class that cannot be destructed (has deleted or inaccessible destructors)
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • T является объединением и имеет вариант член с нетривиальным деструктором (начиная с C++11)
    Оригинал:
    T is a union and has a variant member with non-trivial destructor (начиная с C++11)
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Неявно объявлен деструктор виртуальным (потому что базовый класс имеет виртуальный деструктор) и просмотра для освобождения функции (operator delete() приводит к вызову к неоднозначным, удалены или недоступны функции.
    Оригинал:
    The implicitly-declared destructor is virtual (because the base class has a virtual destructor) and the lookup for the deallocation function (operator delete() results in a call to ambiguous, deleted, or inaccessible function.
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Тривиальные деструктор

Неявно объявлен деструктор для класса T тривиально, если все следующие условия:
Оригинал:
The implicitly-declared destructor for class T is trivial if all of the following is true:
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • деструктор не виртуальный (то есть, деструктор базового класса не виртуальный)
    Оригинал:
    The destructor is not virtual (that is, the base class destructor is not virtual)
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Все прямых базовых классов имеют виртуальные деструкторы
    Оригинал:
    All direct base classes have virtual destructors
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • все не статические данные члены..... тип класса (или массив типа класса) имеют виртуальные деструкторы
    Оригинал:
    All non-static data members of class type (or array of class type) have virtual destructors
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
тривиальные деструктор деструктор, который не выполняет никаких действий. объектов с тривиальной деструкторы не требуют удаления выражение и могут быть утилизированы просто освобождая их хранения. Все типы данных совместимы с языком C (POD типов) тривиально разрушаемое.
Оригинал:
A trivial destructor is a destructor that performs no action. Objects with trivial destructors don't require a delete-expression and may be disposed of by simply deallocating their storage. All data types compatible with the C language (POD types) are trivially destructible.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Неявно определенные деструктор

Если неявно объявлен деструктор не удаляется и не тривиально, оно определено (то есть, тела функции создается и компилируется) компилятором. Это неявно определен деструктор имеет пустое тело.
Оригинал:
If the implicitly-declared destructor is not deleted or trivial, it is defined (that is, a function body is generated and compiled) by the compiler. This implicitly-defined destructor has an empty body.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Уничтожение последовательности

Для обеих заданных пользователем или неявно определены деструкторов, после того, как тело деструктора выполняется, компилятор вызывает деструкторы для всех не-не-статическим вариантом члены класса, в обратном порядке декларации, то она вызывает деструкторы всех прямых базовых классов в порядке, обратном строительства (которое в свою очередь вызвать деструкторы своих членов и их базовые классы и т.д.), а затем, если этот объект имеет наиболее получены Класс, он вызывает деструкторы всех виртуальных баз.
Оригинал:
For both user-defined or implicitly-defined destructors, after the body of the destructor is executed, the compiler calls the destructors for all non-static non-variant members of the class, in reverse order of declaration, then it calls the destructors of all direct base classes in reverse order of construction (which in turn call the destructors of their members and their base classes, etc), and then, if this object is of most-derived class, it calls the destructors of all virtual bases.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Даже когда деструктор вызывается непосредственно (например, obj.~Foo();), возвращение заявления в ~Foo() не возвращает управление вызывающей сразу. она призывает всех тех членов и базовых деструкторов в первую очередь..
Оригинал:
Even when the destructor is called directly (e.g. obj.~Foo();), the return statement in ~Foo() does not return control to the caller immediately: it calls all those member and base destructors first.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Виртуальные деструкторы

Удаление объекта через указатель на базовый вызывает неопределенное поведение, если деструктор в базовом классе является виртуальным
Оригинал:
Deleting an object through pointer to base invokes undefined behavior unless the destructor in the base class is virtual:
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

class Base {
 public:
    virtual ~Base() {}
};
class Derived : public Base {};
Base* b = new Derived;
delete b; // safe

общий принцип таков, что деструктор базового класса должны быть either public and virtual or protected and nonvirtual
Оригинал:
A common guideline is that a destructor for a base class must be either public and virtual or protected and nonvirtual
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Чисто виртуальные деструкторы

деструктор может быть объявлена ​​чисто виртуальной... , например, в базовый класс, который должен быть сделан абстрактно, но не имеет других подходящих функций, которые могут быть объявлена ​​чисто виртуальной Такой деструктор должен иметь определение, так как все деструкторы базового класса всегда вызывается, когда производный класс будет уничтожен.:
Оригинал:
A destructor may be declared pure virtual, for example in a base class which needs to be made abstract, but has no other suitable functions that could be declared pure virtual. Such destructor must have a definition, since all base class destructors are always called when the derived class is destroyed:
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

class AbstractBase {
 public:
    virtual ~AbstractBase() = 0;
};
AbstractBase::~AbstractBase() {}
class Derived : public AbstractBase {};
// AbstractBase obj;   // compiler error
Derived obj;           // OK

[править] Пример

#include <iostream>
 
struct A
{
    int i;
 
    A ( int i ) : i ( i ) {}
 
    ~A()
    {
        std::cout << "~a" << i << std::endl;
    }
};
 
int main()
{
    A a1(1);
    A* p;
 
    { // nested scope
        A a2(2);
        p = new A(3);
    } // a2 out of scope
 
    delete p; // calls the destructor of a3
}

Вывод:

~a2
~a3
~a1