Да, вспомните, как это часто реализуется: new действительно вызывает malloc, который возвращает указатель на (void*)(&(((int*)p)[1]))
, где p - фактическое начало выделенной памяти, а первое int - размер фактической памяти, которую мы вернулся.
Указатель, который мы получаем, на один размер (int) (или что-либо еще, что требуется для выравнивания) дальше в фактической выделенной памяти. Мы кладем туда наш объект, оставляя фактический размер без изменений.
Затем, когда этот указатель передается для удаления, который передает его свободному, free просматривает один int перед переданным указателем, чтобы найти размер, который возвращается.
Передача назад чего-то другого, кроме того, что мы получили, будет означать, что free думает, что произвольный объем фактической памяти возвращается назад, и это соответственно испортит свободный список.
Опять же, это то, как это часто реализуется, а не то, как требуется новое, удаление, malloc или free.