| .. highlight:: c | |
| .. _life-cycle: | |
| Object Life Cycle | |
| ================= | |
| This section explains how a type's slots relate to each other throughout the | |
| life of an object. It is not intended to be a complete canonical reference for | |
| the slots; instead, refer to the slot-specific documentation in | |
| :ref:`type-structs` for details about a particular slot. | |
| Life Events | |
| ----------- | |
| The figure below illustrates the order of events that can occur throughout an | |
| object's life. An arrow from *A* to *B* indicates that event *B* can occur | |
| after event *A* has occurred, with the arrow's label indicating the condition | |
| that must be true for *B* to occur after *A*. | |
| .. only:: builder_html | |
| .. raw:: html | |
| <style type="text/css"> | |
| .. raw:: html | |
| :file: lifecycle.dot.css | |
| .. raw:: html | |
| </style> | |
| .. raw:: html | |
| :file: lifecycle.dot.svg | |
| .. raw:: html | |
| <script> | |
| (() => { | |
| const g = document.getElementById('life_events_graph'); | |
| const title = g.querySelector(':scope > title'); | |
| title.id = 'life-events-graph-title'; | |
| const svg = g.closest('svg'); | |
| svg.role = 'img'; | |
| svg.setAttribute('aria-describedby', | |
| 'life-events-graph-description'); | |
| svg.setAttribute('aria-labelledby', 'life-events-graph-title'); | |
| })(); | |
| </script> | |
| .. only:: not builder_html | |
| .. image:: lifecycle.dot.svg | |
| :align: center | |
| :class: invert-in-dark-mode | |
| :alt: Diagram showing events in an object's life. Explained in detail below. | |
| .. container:: | |
| :name: life-events-graph-description | |
| Explanation: | |
| * When a new object is constructed by calling its type: | |
| #. :c:member:`~PyTypeObject.tp_new` is called to create a new object. | |
| #. :c:member:`~PyTypeObject.tp_alloc` is directly called by | |
| :c:member:`~PyTypeObject.tp_new` to allocate the memory for the new | |
| object. | |
| #. :c:member:`~PyTypeObject.tp_init` initializes the newly created object. | |
| :c:member:`!tp_init` can be called again to re-initialize an object, if | |
| desired. The :c:member:`!tp_init` call can also be skipped entirely, | |
| for example by Python code calling :py:meth:`~object.__new__`. | |
| * After :c:member:`!tp_init` completes, the object is ready to use. | |
| * Some time after the last reference to an object is removed: | |
| #. If an object is not marked as *finalized*, it might be finalized by | |
| marking it as *finalized* and calling its | |
| :c:member:`~PyTypeObject.tp_finalize` function. Python does | |
| *not* finalize an object when the last reference to it is deleted; use | |
| :c:func:`PyObject_CallFinalizerFromDealloc` to ensure that | |
| :c:member:`~PyTypeObject.tp_finalize` is always called. | |
| #. If the object is marked as finalized, | |
| :c:member:`~PyTypeObject.tp_clear` might be called by the garbage collector | |
| to clear references held by the object. It is *not* called when the | |
| object's reference count reaches zero. | |
| #. :c:member:`~PyTypeObject.tp_dealloc` is called to destroy the object. | |
| To avoid code duplication, :c:member:`~PyTypeObject.tp_dealloc` typically | |
| calls into :c:member:`~PyTypeObject.tp_clear` to free up the object's | |
| references. | |
| #. When :c:member:`~PyTypeObject.tp_dealloc` finishes object destruction, | |
| it directly calls :c:member:`~PyTypeObject.tp_free` (usually set to | |
| :c:func:`PyObject_Free` or :c:func:`PyObject_GC_Del` automatically as | |
| appropriate for the type) to deallocate the memory. | |
| * The :c:member:`~PyTypeObject.tp_finalize` function is permitted to add a | |
| reference to the object if desired. If it does, the object is | |
| *resurrected*, preventing its pending destruction. (Only | |
| :c:member:`!tp_finalize` is allowed to resurrect an object; | |
| :c:member:`~PyTypeObject.tp_clear` and | |
| :c:member:`~PyTypeObject.tp_dealloc` cannot without calling into | |
| :c:member:`!tp_finalize`.) Resurrecting an object may | |
| or may not cause the object's *finalized* mark to be removed. Currently, | |
| Python does not remove the *finalized* mark from a resurrected object if | |
| it supports garbage collection (i.e., the :c:macro:`Py_TPFLAGS_HAVE_GC` | |
| flag is set) but does remove the mark if the object does not support | |
| garbage collection; either or both of these behaviors may change in the | |
| future. | |
| * :c:member:`~PyTypeObject.tp_dealloc` can optionally call | |
| :c:member:`~PyTypeObject.tp_finalize` via | |
| :c:func:`PyObject_CallFinalizerFromDealloc` if it wishes to reuse that | |
| code to help with object destruction. This is recommended because it | |
| guarantees that :c:member:`!tp_finalize` is always called before | |
| destruction. See the :c:member:`~PyTypeObject.tp_dealloc` documentation | |
| for example code. | |
| * If the object is a member of a :term:`cyclic isolate` and either | |
| :c:member:`~PyTypeObject.tp_clear` fails to break the reference cycle or | |
| the cyclic isolate is not detected (perhaps :func:`gc.disable` was called, | |
| or the :c:macro:`Py_TPFLAGS_HAVE_GC` flag was erroneously omitted in one | |
| of the involved types), the objects remain indefinitely uncollectable | |
| (they "leak"). See :data:`gc.garbage`. | |
| If the object is marked as supporting garbage collection (the | |
| :c:macro:`Py_TPFLAGS_HAVE_GC` flag is set in | |
| :c:member:`~PyTypeObject.tp_flags`), the following events are also possible: | |
| * The garbage collector occasionally calls | |
| :c:member:`~PyTypeObject.tp_traverse` to identify :term:`cyclic isolates | |
| <cyclic isolate>`. | |
| * When the garbage collector discovers a :term:`cyclic isolate`, it | |
| finalizes one of the objects in the group by marking it as *finalized* and | |
| calling its :c:member:`~PyTypeObject.tp_finalize` function, if it has one. | |
| This repeats until the cyclic isolate doesn't exist or all of the objects | |
| have been finalized. | |
| * :c:member:`~PyTypeObject.tp_finalize` is permitted to resurrect the object | |
| by adding a reference from outside the :term:`cyclic isolate`. The new | |
| reference causes the group of objects to no longer form a cyclic isolate | |
| (the reference cycle may still exist, but if it does the objects are no | |
| longer isolated). | |
| * When the garbage collector discovers a :term:`cyclic isolate` and all of | |
| the objects in the group have already been marked as *finalized*, the | |
| garbage collector clears one or more of the uncleared objects in the group | |
| (possibly concurrently) by calling each's | |
| :c:member:`~PyTypeObject.tp_clear` function. This repeats as long as the | |
| cyclic isolate still exists and not all of the objects have been cleared. | |
| Cyclic Isolate Destruction | |
| -------------------------- | |
| Listed below are the stages of life of a hypothetical :term:`cyclic isolate` | |
| that continues to exist after each member object is finalized or cleared. It | |
| is a memory leak if a cyclic isolate progresses through all of these stages; it should | |
| vanish once all objects are cleared, if not sooner. A cyclic isolate can | |
| vanish either because the reference cycle is broken or because the objects are | |
| no longer isolated due to finalizer resurrection (see | |
| :c:member:`~PyTypeObject.tp_finalize`). | |
| 0. **Reachable** (not yet a cyclic isolate): All objects are in their normal, | |
| reachable state. A reference cycle could exist, but an external reference | |
| means the objects are not yet isolated. | |
| #. **Unreachable but consistent:** The final reference from outside the cyclic | |
| group of objects has been removed, causing the objects to become isolated | |
| (thus a cyclic isolate is born). None of the group's objects have been | |
| finalized or cleared yet. The cyclic isolate remains at this stage until | |
| some future run of the garbage collector (not necessarily the next run | |
| because the next run might not scan every object). | |
| #. **Mix of finalized and not finalized:** Objects in a cyclic isolate are | |
| finalized one at a time, which means that there is a period of time when the | |
| cyclic isolate is composed of a mix of finalized and non-finalized objects. | |
| Finalization order is unspecified, so it can appear random. A finalized | |
| object must behave in a sane manner when non-finalized objects interact with | |
| it, and a non-finalized object must be able to tolerate the finalization of | |
| an arbitrary subset of its referents. | |
| #. **All finalized:** All objects in a cyclic isolate are finalized before any | |
| of them are cleared. | |
| #. **Mix of finalized and cleared:** The objects can be cleared serially or | |
| concurrently (but with the :term:`GIL` held); either way, some will finish | |
| before others. A finalized object must be able to tolerate the clearing of | |
| a subset of its referents. :pep:`442` calls this stage "cyclic trash". | |
| #. **Leaked:** If a cyclic isolate still exists after all objects in the group | |
| have been finalized and cleared, then the objects remain indefinitely | |
| uncollectable (see :data:`gc.garbage`). It is a bug if a cyclic isolate | |
| reaches this stage---it means the :c:member:`~PyTypeObject.tp_clear` methods | |
| of the participating objects have failed to break the reference cycle as | |
| required. | |
| If :c:member:`~PyTypeObject.tp_clear` did not exist, then Python would have no | |
| way to safely break a reference cycle. Simply destroying an object in a cyclic | |
| isolate would result in a dangling pointer, triggering undefined behavior when | |
| an object referencing the destroyed object is itself destroyed. The clearing | |
| step makes object destruction a two-phase process: first | |
| :c:member:`~PyTypeObject.tp_clear` is called to partially destroy the objects | |
| enough to detangle them from each other, then | |
| :c:member:`~PyTypeObject.tp_dealloc` is called to complete the destruction. | |
| Unlike clearing, finalization is not a phase of destruction. A finalized | |
| object must still behave properly by continuing to fulfill its design | |
| contracts. An object's finalizer is allowed to execute arbitrary Python code, | |
| and is even allowed to prevent the impending destruction by adding a reference. | |
| The finalizer is only related to destruction by call order---if it runs, it runs | |
| before destruction, which starts with :c:member:`~PyTypeObject.tp_clear` (if | |
| called) and concludes with :c:member:`~PyTypeObject.tp_dealloc`. | |
| The finalization step is not necessary to safely reclaim the objects in a | |
| cyclic isolate, but its existence makes it easier to design types that behave | |
| in a sane manner when objects are cleared. Clearing an object might | |
| necessarily leave it in a broken, partially destroyed state---it might be | |
| unsafe to call any of the cleared object's methods or access any of its | |
| attributes. With finalization, only finalized objects can possibly interact | |
| with cleared objects; non-finalized objects are guaranteed to interact with | |
| only non-cleared (but potentially finalized) objects. | |
| To summarize the possible interactions: | |
| * A non-finalized object might have references to or from non-finalized and | |
| finalized objects, but not to or from cleared objects. | |
| * A finalized object might have references to or from non-finalized, finalized, | |
| and cleared objects. | |
| * A cleared object might have references to or from finalized and cleared | |
| objects, but not to or from non-finalized objects. | |
| Without any reference cycles, an object can be simply destroyed once its last | |
| reference is deleted; the finalization and clearing steps are not necessary to | |
| safely reclaim unused objects. However, it can be useful to automatically call | |
| :c:member:`~PyTypeObject.tp_finalize` and :c:member:`~PyTypeObject.tp_clear` | |
| before destruction anyway because type design is simplified when all objects | |
| always experience the same series of events regardless of whether they | |
| participated in a cyclic isolate. Python currently only calls | |
| :c:member:`~PyTypeObject.tp_finalize` and :c:member:`~PyTypeObject.tp_clear` as | |
| needed to destroy a cyclic isolate; this may change in a future version. | |
| Functions | |
| --------- | |
| To allocate and free memory, see :ref:`allocating-objects`. | |
| .. c:function:: void PyObject_CallFinalizer(PyObject *op) | |
| Finalizes the object as described in :c:member:`~PyTypeObject.tp_finalize`. | |
| Call this function (or :c:func:`PyObject_CallFinalizerFromDealloc`) instead | |
| of calling :c:member:`~PyTypeObject.tp_finalize` directly because this | |
| function may deduplicate multiple calls to :c:member:`!tp_finalize`. | |
| Currently, calls are only deduplicated if the type supports garbage | |
| collection (i.e., the :c:macro:`Py_TPFLAGS_HAVE_GC` flag is set); this may | |
| change in the future. | |
| .. versionadded:: 3.4 | |
| .. c:function:: int PyObject_CallFinalizerFromDealloc(PyObject *op) | |
| Same as :c:func:`PyObject_CallFinalizer` but meant to be called at the | |
| beginning of the object's destructor (:c:member:`~PyTypeObject.tp_dealloc`). | |
| There must not be any references to the object. If the object's finalizer | |
| resurrects the object, this function returns -1; no further destruction | |
| should happen. Otherwise, this function returns 0 and destruction can | |
| continue normally. | |
| .. versionadded:: 3.4 | |
| .. seealso:: | |
| :c:member:`~PyTypeObject.tp_dealloc` for example code. |