printОбъекты

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

Началом времени существования любого объекта является момент его создания (отведение участка памяти), а окончанием – возвращение отведенного участка памяти системе.
Объекты могут создаваться явно или неявно. Есть два способа создать объекты явно. Во-первых, это можно сделать при объявлении – тогда объект размещается в стеке или в статической памяти. Во-вторых, можно разместить объект, то есть выделить ему память из "кучи". В C++ в любом случае при этом вызывается конструктор, который инициализирует объект. Часто объекты создаются неявно. Так, передача параметра по значению в C++ создает в стеке временную копию объекта.
Создание объектов транзитивно: создание объекта тянет за собой создание других объектов, входящих в него. Переопределение семантики конструктора копий и операции присваивания в C++ разрешает явное управление тем, когда части объекта создаются и уничтожаются.
Уничтожение объектов также может выполняться явно и неявно. В Smalltalk и Java при потере последней ссылки на объект его забирает сборщик мусора. В языках без сборки мусора, типа C++, объекты, созданные в стеке, уничтожаются неявно при выходе из блока, в котором они были определены, но объекты, созданные в "куче" оператором new, продолжают существовать и занимать место в памяти: их необходимо явно уничтожать оператором delete. Если объект "забыть", не уничтожить, это вызовет утечку памяти. Если же объект попробуют уничтожить повторно (например, через другой указатель), последствием будет сообщение о нарушении памяти или полный крах системы.
При явном или неявном уничтожении объекта в C++ вызывается соответствующий деструктор. Его задача не только освободить память, но и решить, что делать с другими ресурсами, например, с открытыми файлами.
В некоторых системах объекты могут быть долгоживущими; под этим понимается, что их время жизни может выходить за время жизни породивших их программ. Все объекты, которым мы хотим обеспечить долгую жизнь, должны наследовать от специальных сохраняемых классов.
loading