Я хочу сказать, что это где-то между реализацией определенной и неопределенной.
5.3.5 / 2: «В первом варианте (удаление объекта) значение
операндом удаления может быть ... указатель на
объект не массив, созданный предыдущим выражением new ....
Значение указателя не изменяется при использовании так, как вы это сделали, поэтому это должно работать как положено, если sizeof(char*) == sizeof(int*)
Результат этого конкретного сравнения определяется реализацией, и если предположение ложно, то поведение не определено.
Так что это действительно не особо безопасно.