Причина, по которой New
знает, сколько памяти выделяется, заключается в том, что New
- это магия компилятора . Это встроенный язык, поэтому, когда компилятор видит, что вы его называете, он переписывает его примерно так:
// New(foo);
foo := System._New(SizeOf(foo^), TypeInfo(TypeOf(foo^)));
TypeOf
здесь вымышленная функция Delphi для пояснительных целей. Компилятор знает объявленный тип foo
, потому что он знает, где находятся все ваши объявления переменных. Вы можете посмотреть на реализацию _New
в System.pas . Аналогичная перезапись происходит для Dispose
, поэтому он знает, какой тип завершения сделать перед освобождением памяти.
Идеи переменных и объявлений являются понятиями времени компиляции. Во время выполнения они перестают существовать. Во время выполнения указатель - это просто адрес. Тип того, на что он указывает, был определен во время компиляции. Типы определяют размер чего-либо.
Если вам нужно написать функцию, которая принимает указатели на несколько вещей с разными размерами, вам просто нужно предоставить второй параметр , который описывает, на что указывает первый.
Проверьте еще один вопрос здесь: " Как узнать, какой тип является переменной ." Спрашивающий задавался вопросом, как определить дополнительную информацию о переменной, учитывая только ее адрес.