Smart pointer

Smart pointer

Умный указатель (англ. smart pointer) — класс (обычно шаблонный), имитирующий интерфейс обычного указателя и добавляющий некую новую функциональность, например проверку границ при доступе или очистку памяти.

Содержание

Владеющие указатели

Чаще всего умный указатель инкапсулирует семантику владения ресурсом. В таком случае он называется владеющим указателем.

Владеющие указатели применяются для борьбы с утечками памяти и висячими ссылками. Утечкой памяти называется ситуация, когда в программе нет ни одного указателя, хранящего адрес объекта, созданного в динамической памяти. Висячей ссылкой называется указатель, ссылающийся на уже удалённый объект. Семантика владения для динамически созданных объектов означает, что удаление или присвоение нового значения указателю будет согласовано с временем жизни объекта.

Простые владеющие указатели

Такие указатели при присвоении нового значения или удалении сами удаляют объект. Их недостатком являются трудности с передачей объекта за пределы области видимости указателя.

Указатели с подсчётом ссылок

Такие обычно используются с объектами, имеющими специальные операции «увеличить число ссылок» (AddRef() в COM). Чаще всего такие объекты унаследованы от специального класса или интерфейса (например, IUnknown в

Такая методика называется автоматическим подсчётом ссылок. Она согласует число указателей, хранящих адрес объекта, с числом ссылок, хранящимся в объекте, а при достижении этим числом нулевого значения приводит к удалению объекта. Её преимуществами являются относительно высокие надёжность, быстродействие и простота реализации в C++. Недостатком является бесполезность в случае возникновения циклических ссылок.

Реализации

В

Объект обязан хранить внутри себя неотрицательное целое, которое означает число внешних указателей, ссылающихся на этот объект.

При присваивании указателю адреса нового объекта указатель вызывает у объекта метод AddRef(). Если перед этим указатель ссылался на другой объект, то сначала вызывается метод Release() прежнего объекта. При удалении указателя (выходе его из области видимости или разрушении объекта, полем которого он являлся), если этот указатель ссылается на существующий объект, указатель вызывает метод Release() объекта.

Реализация метода Release() каждый раз уменьшает число ссылок на единицу и сразу проверяет новое значение. Если число ссылок стало равно нулю, метод Release() вызывает удаление объекта.

Другой вариант реализации используется boost::shared_ptr. В этом случае, счетчики ссылок хранятся в специальной структуре данных вне объекта.

Проблема циклических ссылок

Предположим, есть два объекта и в каждом из них по владеющему указателю. Указателю в первом объекте присвоим адрес второго объекта, а указателю во втором — адрес первого объекта. Если теперь всем внешним (т. е. не хранящимся внутри этих объектов) указателям на два данных объекта присвоить новые значения, то указатели внутри объектов по-прежнему будут владеть друг другом и будут оставаться в памяти. В результате возникнет ситуация, когда к объектам невозможно получить доступ, т. е. утечка памяти.

Проблема циклических ссылок решается либо путем соответствующего проектирования структур данных, либо использованием сборки мусора.

Примеры реализаций


Wikimedia Foundation. 2010.

Игры ⚽ Поможем решить контрольную работу

Полезное


Смотреть что такое "Smart pointer" в других словарях:

  • Smart pointer — In computer science, a smart pointer is an abstract data type that simulates a pointer while providing additional features, such as automatic garbage collection or bounds checking. These additional features are intended to reduce bugs caused by… …   Wikipedia

  • Smart Pointer — Intelligente Zeiger oder Smart Pointers werden in vielen gängigen objektorientierten Programmiersprachen, meistens C++, verwendet. Es sind spezielle Objekte, welche einfache Zeigervariablen einkapseln und mit zusätzlichen Funktionen und… …   Deutsch Wikipedia

  • Smart pointer — Intelligente Zeiger oder Smart Pointers werden in vielen gängigen objektorientierten Programmiersprachen, meistens C++, verwendet. Es sind spezielle Objekte, welche einfache Zeigervariablen einkapseln und mit zusätzlichen Funktionen und… …   Deutsch Wikipedia

  • Pointer (computing) — This article is about the programming data type. For the input interface (for example a computer mouse), see Pointing device. Pointer a pointing to the memory address associated with variable b. Note that in this particular diagram, the computing …   Wikipedia

  • Pointer overflow — Pufferüberläufe (engl. buffer overflow) gehören zu den häufigsten Sicherheitslücken in aktueller Software, die sich u. a. über das Internet ausnutzen lassen können. Im Wesentlichen werden bei einem Pufferüberlauf durch Fehler im Programm zu große …   Deutsch Wikipedia

  • Pointer (Informatik) — Mit Zeiger oder Pointer wird in der Informatik eine spezielle Variable bezeichnet, die auf eine andere Variable oder Funktion verweist. Der referenzierte Speicherbereich enthält entweder Daten (Objekt, Variable) oder Programmcode. Zeiger auf… …   Deutsch Wikipedia

  • Dangling pointer — Dangling pointers and wild pointers in computer programming are pointers that do not point to a valid object of the appropriate type. These are special cases of memory safety violations. Dangling Pointer Dangling pointers arise when an object is… …   Wikipedia

  • Stanford Smart Memories Project — Advances in VLSI technology now permit multiple processors to reside on a single integrated circuit chip, or IC. Such a processing system is known as a chip multiprocessor, or multi core CPU system. Building on this technology, the Stanford Smart …   Wikipedia

  • Maxwell Smart (record producer) — Maxwell Smart Birth name Max Perry Born June 23, 1984 (1984 06 23) (age 27) Origin Brooklyn, New York, United States Genres …   Wikipedia

  • Puntero inteligente — En programación, un puntero inteligente (o smart pointer) es un tipo abstracto de datos que simula el comportamiento de un Puntero (informática) pero añadiendo nuevas características adicionales, como recolector de basura automático y comprobador …   Wikipedia Español


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»