Программирование. Принципы и практика использования C++ Исправленное издание, стр. 228
{ vector v(n); // определяем вектор, // выделяющий память для других n переменных // типа int // ...используем вектор v... v.clean_up(); // функция clean_up() удаляет член elem}
clean_up()// очень упрощенный вектор, содержащий числа типа doubleclass vector { int sz; // размер double* elem; // указатель на элементыpublic: vector(int s) // конструктор :sz(s), elem(new double[s]) // выделяет память { for (int i=0; i<s; ++i) elem[i]=0; // инициализируем // элементы } ~vector() // деструктор { delete[] elem; } // освобождаем память // ...};Итак, теперь можно написать следующий код:
void f3(int n){ double* p = new double[n]; // выделяем память для n // чисел типа double vector v(n); // определяем вектор (выделяем память // для других n чисел типа double) // ...используем p и v... delete[ ] p; // освобождаем память, занятую массивом // чисел типа double} // класс vector автоматически освободит // память, занятую объектом vОказывается, оператор
delete[]vectornewdelete[]vectorvector
iostream17.5.1. Обобщенные указатели
Если член класса имеет деструктор, то этот деструктор будет вызываться при уничтожении объекта, содержащего этот член. Рассмотрим пример.
struct Customer { string name; vector<string> addresses; // ...};void some_fct(){ Customer fred; // инициализация объекта fred // использование объекта fred}Когда мы выйдем из функции
some_fct()fredaddressesCustomerДеструкторы для членов — и для базовых классов — неявно вызываются из деструктора производного класса (либо определенного пользователем, либо сгенерированного). По существу, все правила сводятся к одному: деструкторы вызываются тогда, когда объект уничтожается (при выходе из области видимости, при выполнении оператора
delete17.5.2. Деструкторы и свободная память
• Если функции в качестве ресурса требуется какой-то объект, она обращается к конструктору.
• На протяжении своего срока существования объект может освобождать ресурсы и запрашивать новые.
• В конце существования объекта деструктор освобождает все ресурсы, которыми владел объект.
Типичным примером является пара “конструктор–деструктор” в классе
vector