delete p;
не является вызовом функции;это выражение .То, что вы хотите, не имеет смысла.
Существует свободная функция ::operator delete()
, но она не делает то, что вы думаете.
Посмотрите на реализацию любого стандартного контейнера библиотеки(ключевое слово: allocator) или, возможно, std::unique_ptr
, чтобы увидеть, как обрабатывается удаление настраиваемого объекта.
Типичная последовательность строительства / разрушения, разбитая на части, выглядит следующим образом:
void * addr = ::operator new(sizeof(T)); // allocation
T * p = ::new (addr) T; // construction
p->~T(); // destruction
::operator delete(addr); // deallocation
Первые шаги морально эквивалентны выражению T * p = new T;
, а последним - delete p;
.Однако нет способа вызвать конструктор, кроме как с помощью new
выражения ;и вы не должны забывать вызывать деструктор так или иначе.