¿Cómo eliminar un objeto construido a través de un nuevo operador de colocación?

char * buf = new char[sizeof(T)];
new (buf) T;
T * t = (T *)buf;
//code...
//here I should destruct *t but as it is argument of template and can be
//instantiated via basic types as well (say int) so such code 
/*t->~T();*/
//is incorrect (maybe correct? Strange, but it works on VS 2005 for basic types.)
//and this code 
/*delete t;*/ 
//crashes the program.
delete [] buf;

Entonces, ¿cuál es la forma correcta de destruirt?

PD. El código anterior es solo para describir mi problema y no tiene una relación real con el código que voy a escribir. Así que por favor no dé respuestas como (¿Por qué usar colocaciónnew en lugar de no colocación? o algo similar

Respuestas a la pregunta(4)

Su respuesta a la pregunta