Например, следующий фрагмент кода определяет четыре объекта класса Sales_data:
{ //
//
*p = new Sales_data; //
auto p2 = make_shared
Sales_data item(*p); //
vector
vec.push_back(*p2); //
delete p; //
//
} //
//
//
//
//
Каждый из этих объектов содержит член типа string, который резервирует динамическую память для содержания символов переменной-члена bookNo. Но единственная память, которой код должен управлять непосредственно, — это самостоятельно зарезервированный объект. Код непосредственно освобождает только динамически созданный объект, связанный с указателем p.
Другие объекты класса Sales_data автоматически удаляются при выходе из области видимости. По завершении блока vec, p2 и item выходят из области видимости, это означает вызов деструкторов классов vector, shared_ptr и Sales_data для соответствующих объектов. Деструктор класса vector удалит элемент, помещенный в вектор vec. Деструктор класса shared_ptr осуществит декремент счетчика ссылок объекта, на который указывает указатель p2. В данном примере этот счетчик достигнет нуля, поэтому деструктор класса shared_ptr удалит объект класса Sales_data, зарезервированный с использованием указателя p2.
Во всех случаях деструктор класса Sales_data неявно удаляет переменную-член bookNo. Удаление переменной-члена bookNo запускает деструктор класса string, который освобождает память, используемую для хранения ISBN.
Компилятор определяет
Например, синтезируемый деструктор класса Sales_data эквивалентен следующему:
class Sales_data {
public:
//
//
~Sales_data() { }
//
};
Переменные-члены автоматически удаляются после выполнения (пустого) тела деструктора. В частности, деструктор класса string будет выполнен для освобождения памяти, используемой переменной-членом bookNo.
Важно понять, что само тело деструктора не удаляет переменные-члены непосредственно. Они удаляются в ходе неявной фазы удаления, которая следует за телом деструктора. Тело деструктора выполняется
Упражнение 13.9. Что такое деструктор? Что делает синтезируемый деструктор? Когда деструктор синтезируется?
Упражнение 13.10. Что произойдет при удалении объекта класса StrBlob? А класса StrBlobPtr?
Упражнение 13.11. Добавьте деструктор в класс HasPtr из предыдущих упражнений.
Упражнение 13.12. Сколько вызовов деструктора происходит в следующем фрагменте кода?
bool fcn(const Sales_data *trans, Sales_data accum) {
Sales_data item1(*trans), item2(accum);
return item1.isbn() != item2.isbn();
}