|
|
Рассмотрим пример:
main()
{
table* p = new table(100);
table* q = new table(200);
delete p;
delete p; // вероятно, вызовет ошибку при выполнении
}
Конструктор table::table() будет вызываться дважды, как и деструктор
table::~table(). Но это ничего не значит, т.к. в С++ не
гарантируется, что деструктор будет вызываться только для объекта,
созданного операцией new. В этом примере q не уничтожается вообще,
зато p уничтожается дважды! В зависимости от типа p и q программист
может считать или не считать это ошибкой. То, что объект не
удаляется, обычно бывает не ошибкой, а просто потерей памяти. В то же
время повторное удаление p - серьезная ошибка. Повторное применение
delete к тому же самому указателю может привести к бесконечному
циклу в подпрограмме, управляющей свободной памятью. Но в языке
результат повторного удаления не определен, и он зависит от
реализации.
Пользователь может определить свою реализацию операций new и
delete (см. $$3.2.6 и $$6.7). Кроме того, можно установить
взаимодействие конструктора или деструктора с операциями new и
delete (см. $$5.5.6 и $$6.7.2). Размещение массивов в свободной
памяти обсуждается в $$5.5.5.
| |