Рассмотрим пример:
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. Кроме того, можно установить взаимодействие конструктора или деструктора с операциями new и delete.