Надгробия — это механизм обнаружения висячих указателей и смягчения проблем, которые они могут вызывать в компьютерных программах. Висячие указатели могут появляться в некоторых языках программирования , например , C , C++ и языках ассемблера .
Надгробие — это структура, которая действует как посредник между указателем и его целью, часто динамическими данными кучи в памяти . Указатель — иногда называемый дескриптором — указывает только на надгробия и никогда на свою фактическую цель. Когда данные освобождаются, надгробие устанавливается в ноль ( или, в более общем смысле, в значение, которое является недопустимым для указателя в данной среде выполнения), указывая, что переменная больше не существует. [1] Этот механизм предотвращает использование недействительных указателей, которые в противном случае получили бы доступ к области памяти, которая когда-то принадлежала теперь освобожденной переменной, хотя она уже может содержать другие данные, что, в свою очередь, приводит к повреждению данных в памяти. В зависимости от операционной системы , ЦП может автоматически обнаруживать такой недействительный доступ (например, для значения null: ошибка разыменования нулевого указателя ). Это помогает при анализе фактической причины, ошибки программирования, при отладке , а также может использоваться для прерывания программы в производственном использовании, чтобы предотвратить ее продолжение с недействительными структурами данных.
В более общих терминах надгробие можно понимать как маркер «этих данных больше нет». Например, в файловых системах может быть эффективно при удалении файлов помечать их как «мертвые» вместо немедленного восстановления всех их блоков данных. [2]
Недостатки использования надгробий включают вычислительные издержки и дополнительное потребление памяти: необходима дополнительная обработка для отслеживания пути от указателя к данным через надгробие, а также дополнительная память необходима для сохранения надгробий для каждого указателя по всей программе. Еще одна проблема заключается в том, что весь код, который должен работать с рассматриваемыми указателями, должен быть реализован для использования механизма надгробий. [3]
Среди популярных языков программирования C++ реализует шаблон tombstone в своей стандартной библиотеке как слабый указатель с использованием std::weak_ptr. Встроенная поддержка языков программирования или компилятора не является обязательной для использования этого механизма.