Иногда можно определить, когда адрес, на который указывает указатель, находится в блоке памяти, который находится в списке освобожденных блоков памяти кучи. Однако для этого необходимо сравнить указатель на потенциально каждый блок в свободном списке кучи, который может содержать тысячи блоков. Таким образом, это потенциально сложная вычислительная операция, которую вы не хотели бы делать часто, за исключением, возможно, режима строгой диагностики.
Этот метод работает только тогда, когда блок памяти, на который указатель указывал, продолжает оставаться в списке свободных кучи. Поскольку новые объекты выделяются из кучи, вполне вероятно, что освобожденный блок памяти будет удален из списка свободных кучи и снова переведен в активное воспроизведение в качестве дома нового другого объекта. Исходный висячий указатель по-прежнему указывает на тот же адрес, но объект, находящийся по этому адресу, изменился. Если вновь выделенный объект имеет тот же (или совместимый) тип, что и исходный объект, который теперь освобожден, практически невозможно узнать, что указатель возник как ссылка на предыдущий объект. На самом деле, в этой очень особенной и редкой ситуации, висячий указатель будет работать на отлично. Единственной наблюдаемой проблемой может быть, если кто-то заметит, что данные неожиданно изменились из-под указателя.
Если вы не выделяете и не освобождаете одни и те же типы объектов снова и снова в быстрой последовательности, маловероятно, что новый объект, выделенный из этого освобожденного блока памяти, будет того же типа, что и исходный. Когда типы оригинала и нового объекта различаются, у вас есть шанс выяснить, что содержимое изменилось из-под указателя. Однако для этого вам нужен способ узнать тип исходного объекта, на который ссылается указатель. Во многих ситуациях в собственных скомпилированных приложениях тип самой переменной-указателя не сохраняется во время выполнения. Указатель - это указатель в том, что касается процессора - аппаратное обеспечение очень мало знает о типах данных. В строгом диагностическом режиме вполне возможно, что вы могли бы создать справочную таблицу, чтобы связать каждую переменную-указатель с типом, назначенным и назначенным ей, но это огромная задача.
Вот почему Assigned () не является утверждением, что указатель действителен. Это просто проверяет, что указатель не ноль.
Почему Borland создал функцию Assigned () для начала? Для дальнейшего скрытия указателей от начинающих и случайных программистов. Вызовы функций легче читать и понимать, чем операции с указателями.