Cтраница 1
Висячие ссылки могут привести к полному хаосу. При попытке программы изменить с помощью висячей ссылки структуру данных, которая уже уничтожена, может измениться содержимое элемента списка свободного пространства. Если это изменение затронет указатель, связывающий этот элемент со следующим элементом списка свободного пространства, то весь остаток списка свободного пространства, вероятно, превратится в мусор. Что еще хуже, последующие попытки программы распределения памяти воспользоваться указателем в измененном элементе приведут к совершенно непредсказуемым результатам, например в качестве свободного пространства может быть выделена и позднее изменена область внутри выполняемой программы. Аналогичные проблемы возникают в случае, когда перед употреблением висячей ссылки элемент, на который она указывает, был уже перераспределен для других целей. [1]
Появление висячих ссылок вызывается тем, что утилизация памяти, занимаемой уничтоженной структурой, происходит слишком быстро, раньше, чем будут разрушены все пути доступа. [2]
Как мусор, так и висячие ссылки могут вызвать значительные трудности для системы управления памятью. [3]
В результате в языке Си возможно появление висячих ссылок ( т.е. указателей, указывающих на несуществующий объект), в частности указателей на уже неактивные объекты и указателей на объекты, предварительно уничтоженные явным образом. В языке Паскаль возможно появление висячих ссылок только на предварительно уничтоженные явным образом объекты. Ограничения, имеющиеся в языке Паскаль, с одной стороны, делают использование ссылок более безопасным, а с другой - ограничивают использование ссылок. Например, на языке Паскаль невозможно реализовать распределитель памяти общего назначения. [4]
Системе, функционирующей во время выполнения, избежать создания мусора или висячих ссылок может быть столь же трудно. Например, в Лиспе основной структурой данных являются связанные списки. Элемент можег освободиться операцией CDR только при условии, что исходный указатель, переданный CDR, есть единственный указатель на этот элемент. [5]
В таких случаях программисту не составляет никакого труда нечаянно создать мусор пли висячие ссылки с соответствующими, иногда ужасными, последствиями. [6]
Утилизация памяти в куче путем явного возврата памяти создает возможность появления мусора и висячих ссылок. [7]
![]() |
Операция CDR в Лиспе с использованием счетчиков ссылок. [8] |
Счетчики ссылок позволяют во многих ситуациях избежать появления как мусора, так и висячих ссылок. Если в каждом элементе списка имеется счетчик ссылок, то в операции CDR нетрудно избежать рассмотренные выше трудности. [9]
Эти два примера обозначают проблемы, которые приходится решать при разработке языков для того, чтобы избежать появления висячих ссылок. Конструкция Алгола делает возможным простое определение момента уничтожения структуры, но ценой соблюдения некоторых весьма жестких правил, касающихся альтернативных путей доступа к структуре. Лисп предоставляет большую гибкость в создании альтернативных путей доступа, но в нем отсутствует простой способ определения, когда структура становится мусором. [10]
Если же CDR возвратит элемент в список свободного пространства и на этот элемент существуют другие указатели, то все эти указатели станут висячими ссылками. Если мы не располагаем прямым способом, позволяющим определить наличие таких указателей, то операция CDR потенциально должна порождать мусор или висячие ссылки. [11]
Говоря о языке Паскаль, необходимо отметить не только то, что перечень опасных свойств языка Паскаль намного короче соответствующего перечня для языка Си ( в него попадают лишь записи с вариантами, передача функций и процедур в качестве параметров, висячие ссылки на динамические объекты), но и то, что опасные свойства языка Паскаль сопутствуют относительно редко используемым средствам языка Паскаль. [12]
В результате в языке Си возможно появление висячих ссылок ( т.е. указателей, указывающих на несуществующий объект), в частности указателей на уже неактивные объекты и указателей на объекты, предварительно уничтоженные явным образом. В языке Паскаль возможно появление висячих ссылок только на предварительно уничтоженные явным образом объекты. Ограничения, имеющиеся в языке Паскаль, с одной стороны, делают использование ссылок более безопасным, а с другой - ограничивают использование ссылок. Например, на языке Паскаль невозможно реализовать распределитель памяти общего назначения. [13]
Считается, что всю остальную память занимает мусор, который и утилизуется для повторного использования. Такой метод позволяет решить проблему висячих ссылок, но ценой выполнения полной проверки всех возможных путей доступа к структуре перед принятием решения о том, что она является мусором и занимаемую ею память можно использовать. [14]
Висячие ссылки могут привести к полному хаосу. При попытке программы изменить с помощью висячей ссылки структуру данных, которая уже уничтожена, может измениться содержимое элемента списка свободного пространства. Если это изменение затронет указатель, связывающий этот элемент со следующим элементом списка свободного пространства, то весь остаток списка свободного пространства, вероятно, превратится в мусор. Что еще хуже, последующие попытки программы распределения памяти воспользоваться указателем в измененном элементе приведут к совершенно непредсказуемым результатам, например в качестве свободного пространства может быть выделена и позднее изменена область внутри выполняемой программы. Аналогичные проблемы возникают в случае, когда перед употреблением висячей ссылки элемент, на который она указывает, был уже перераспределен для других целей. [15]