Если вы пишете
fool->~Fool();
Вы заканчиваете время жизни объекта, которое вызывает деструктор и восстанавливает внутренний массив array
.Однако память, в которой хранится объект, не освобождается, что означает, что если вы хотите вернуть объект к жизни, используя новое размещение:
new (fool) Fool;
, вы можете сделать это.
В соответствии со спецификацией чтение или запись значений полей fool
после явного вызова деструктора приводит к неопределенному поведению, поскольку время жизни объекта закончилось, но память, содержащая объект, все равно должна быть выделенаи вам нужно будет освободить его, вызвав operator delete
:
fool->~Fool();
operator delete(fool);
Причина использования operator delete
вместо простого написания
delete fool;
заключается в том, что последний имеет неопределенное поведение,потому что время жизни fool
уже закончилось.Использование необработанной процедуры освобождения operator delete
гарантирует, что память восстанавливается, не пытаясь что-либо сделать, чтобы закончить время жизни объекта.
Конечно, если память для объекта не была взята из new
(возможно,он распределяется по стеку, или, возможно, вы используете собственный распределитель), тогда вам не следует использовать operator delete
для его освобождения.Если бы вы сделали, вы бы в конечном итоге с неопределенным поведением (снова!).Это, кажется, повторяющаяся тема в этом вопросе.: -)
Надеюсь, это поможет!