stringtranslate.com

Время жизни объекта

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

Терминология

Аспекты жизненного цикла объекта различаются между языками программирования и в рамках реализаций языка. Основные концепции относительно общие, но терминология различается. Например, концепции создания и уничтожения иногда называются конструкцией и деструкцией , а элементы языка называются конструктором (ctor) и деструктором (dtor).

Детерминизм

Создание объекта обычно детерминировано , но уничтожение зависит от контекста программирования. Некоторые контексты допускают детерминированное уничтожение, а некоторые — нет. В частности, в среде сборки мусора объекты уничтожаются по выбору сборщика мусора.

Синтаксис создания и уничтожения различается в зависимости от контекста программирования. Во многих контекстах, включая C++, C# и Java, объект создается с помощью специального синтаксиса, например . В C++, который обеспечивает ручное управление памятью , объект уничтожается с помощью ключевого слова . В C# и Java, где нет явного синтаксиса уничтожения, сборщик мусора уничтожает неиспользуемые объекты автоматически и недетерминированно.new typename()delete

Альтернативный и детерминированный подход к автоматическому уничтожению заключается в том, что объект уничтожается, когда код уменьшает счетчик ссылок объекта до нуля.

С пулом объектов , где объекты могут быть созданы заранее и повторно использованы, видимое создание и уничтожение объекта может не соответствовать фактическому. Пул обеспечивает повторную инициализацию для создания и финализацию для уничтожения. Как создание, так и уничтожение могут быть недетерминированными.

Объекты со статическим распределением памяти имеют время жизни, совпадающее с выполнением программы , но порядок создания и уничтожения различных статических объектов, как правило, недетерминирован.

Жизненный цикл

Жизненный цикл объекта относится к событиям, которые переживает объект, включая создание и уничтожение, а также между ними.

Жизненный цикл обычно включает управление памятью и операции после выделения и перед освобождением. Создание объекта обычно состоит из выделения памяти и инициализации , где инициализация включает назначение значений полям и запуск кода инициализации. Уничтожение объекта обычно состоит из финализации (она же очистка) и освобождения памяти (она же освобождение). Эти шаги обычно выполняются в следующем порядке: выделение, инициализация, финализация, освобождение.

В зависимости от контекста программирования эти шаги могут быть частично или полностью автоматизированы, а некоторые из них можно настраивать.

Частота настройки, как правило, варьируется в зависимости от шага и контекста программирования. Инициализация — наиболее часто настраиваемый шаг. Финализация распространена в языках с детерминированным уничтожением, особенно в C++, но редка в языках со сборкой мусора. Выделение редко настраивается, а освобождение, как правило, не может быть настроено.

Создание

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

Разрушение

Обычно объект удаляется из памяти после того, как он больше не нужен. Однако, если памяти достаточно или программа имеет короткое время выполнения, уничтожение объекта может не произойти; память просто освобождается при завершении процесса.

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

В языках на основе классов с детерминированным временем жизни объекта, в частности C++, деструктор вызывается при удалении экземпляра, до того, как память будет освобождена. В C++ деструкторы отличаются от конструкторов несколькими способами. Они не могут быть перегружены, не должны иметь аргументов, не должны поддерживать инварианты класса и могут вызывать завершение программы, если они выдают исключения.

При сборке мусора объекты могут быть уничтожены, когда программа больше не может к ним получить доступ. Сборщик мусора вызывает финализатор перед освобождением памяти.

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

Последовательность

Время жизни объекта начинается с момента завершения выделения и заканчивается с началом освобождения. Таким образом, во время инициализации и финализации объект жив, но может не находиться в согласованном состоянии. Период между завершением инициализации и началом финализации — это период, когда объект и жив, и находится в согласованном состоянии.

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

Для статической переменной , срок жизни которой совпадает с запуском программы, ошибка создания или уничтожения является проблематичной, поскольку выполнение программы происходит до или после обычного выполнения.

Программирование на основе классов

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

Примечательно, что конструктор является методом класса, поскольку до тех пор, пока объект не создан, объект (экземпляр) недоступен, а деструкторы, инициализаторы и финализаторы являются методами экземпляра.

Кроме того, конструкторы и инициализаторы часто могут принимать аргументы, в то время как деструкторы и финализаторы, как правило, этого не делают, поскольку их часто можно вызвать неявно.

Управление ресурсами

В языках с детерминированными объектами времени жизни, время жизни может использоваться для управления ресурсами . Это называется идиомой «получение ресурсов — это инициализация» (RAII). Ресурсы приобретаются во время инициализации и освобождаются во время финализации. В языках с недетерминированными объектами времени жизни (т. е. сборщиком мусора) управление памятью обычно отделено от управления другими ресурсами.

Примеры

С++

Класс C++ может быть объявлен со значениями по умолчанию следующим образом:

класс Фу {};  

При объявлении в автоматическом контексте объект уничтожается при закрытии блока, в котором он объявлен.

int bar () { Foo foo (); // foo уничтожается здесь }     

При динамическом создании он существует до тех пор, пока не будет явно уничтожен.

int bar () { Foo * pFoo = new Foo (); удалить pFoo ; }         

Ява

Класс Java может быть объявлен со значениями по умолчанию следующим образом:

класс  Фу {} 

После создания экземпляра (т. е. new Foo()) он существует до тех пор, пока на него не останется ссылок, и сборщик мусора не удалит его.

Ссылки