Разве delete ptr отличается от operator delete(ptr) только тем, что delete вызывает ptr деструктор? Или, другими словами, delete ptr сначала вызывает деструктор ptr, а затем operator delete(ptr) для освобождения выделенной памяти? Тогда delete ptr технически эквивалентно следующему:
T * ptr = new T;
//delete ptr equivalent:
ptr->~T();
::operator delete(static_cast<void *>(ptr));
?