Возможно, вы думаете о формах размещения и удаления операторов, которые имеют подписи:
void operator delete(void *, void *) throw();
void operator delete(void *, const std::nothrow_t&) throw();
void operator delete[](void *, void *) throw();
void operator delete[](void *, const std::nothrow_t&) throw();
Они никогда не вызываются во время нормальной работы, но будут использоваться в случае, когда конструктор для объекта, который создается с размещением new , вызывает исключение. Как правило, вам не нужно их определять, так как компилятор уже вызвал деструктор (ы) в базах и членах мертвого объекта, и для размещения нового нет памяти, которую нужно освобождать. Но может существовать, если вы перегружаете место размещения новым и вам нужен соответствующий оператор.
Второй аргумент на самом деле не используется, а просто отличает сигнатуру для обычного:
void operator delete(void *)
Это не специальные фиктивные аргументы, как у оператора ++. Они просто являются экземпляром общего правила, которое вызывает new с дополнительными аргументами, такими как:
obj = new(x,y,z) Object(a,b,c)
будет генерировать неявный код для очистки от ошибок конструктора, который передает те же дополнительные аргументы оператору delete, который будет функционировать (приблизительно) как:
void *raw = operator new(sizeof(Object), x,y,z)
try {
obj = new(raw) Object(a,b,c);
} catch(...) {
operator delete(raw,x,y,z);
throw;
}