Precisamos separar alocação e inicialização de algum armazenamento de heap. Infelizmente, o código do cliente usa delete p;
para excluir o ponteiro. Se tivéssemos controle da exclusão, poderíamos alocar com ::operator new (sizeof(T), std::align_val_t(alignof(T)))
e então usar posicionamento new
e o global correspondente ::operator delete
. Mas (se entendi corretamente) delete
pode chamar T::operator delete
, potencialmente exigindo uma alocação que veio de T::operator new
, com uma ordem de preferência complicada entre os diferentes argumentos possíveis para T::operator new
e T::operator delete
se houver múltiplas sobrecargas.
Existe algo assim std::allocate_as_if_by_new<T>()
que fará exatamente a mesma alocação que new T(...)
eu faria, mas sem inicializar, ou pelo menos garantirá que (após a inicialização) delete p;
irá desalocá-la corretamente?