diff options
author | Sam Gross <colesbury@gmail.com> | 2021-10-28 19:22:57 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-10-28 19:22:57 (GMT) |
commit | 9e0012116ac9e8d26bf19ef8741deeecf2b6f72b (patch) | |
tree | 95dc6fd9733e9fabaa60572d66f1bd9cae7ed181 /Doc/extending | |
parent | 54579087c69f95531cbe7a97401c67f104a3e52f (diff) | |
download | cpython-9e0012116ac9e8d26bf19ef8741deeecf2b6f72b.zip cpython-9e0012116ac9e8d26bf19ef8741deeecf2b6f72b.tar.gz cpython-9e0012116ac9e8d26bf19ef8741deeecf2b6f72b.tar.bz2 |
[3.10] bpo-28737: Document when tp_dealloc should call PyObject_GC_UnTrack() (GH-29246) (GH-29249)
Objects that support garbage collection ("container" objects) should
call PyObject_GC_UnTrack() from their destructors before clearing any
fields which may point to other "container" objects.
(cherry picked from commit 35e1ff38ee67ee543d9fcb268c3552c5397f9b3f)
Co-authored-by: Sam Gross <colesbury@gmail.com>
Diffstat (limited to 'Doc/extending')
-rw-r--r-- | Doc/extending/newtypes.rst | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/Doc/extending/newtypes.rst b/Doc/extending/newtypes.rst index 6e17897..23ec8bc 100644 --- a/Doc/extending/newtypes.rst +++ b/Doc/extending/newtypes.rst @@ -73,7 +73,19 @@ function:: newdatatype_dealloc(newdatatypeobject *obj) { free(obj->obj_UnderlyingDatatypePtr); - Py_TYPE(obj)->tp_free(obj); + Py_TYPE(obj)->tp_free((PyObject *)obj); + } + +If your type supports garbage collection, the destructor should call +:c:func:`PyObject_GC_UnTrack` before clearing any member fields:: + + static void + newdatatype_dealloc(newdatatypeobject *obj) + { + PyObject_GC_UnTrack(obj); + Py_CLEAR(obj->other_obj); + ... + Py_TYPE(obj)->tp_free((PyObject *)obj); } .. index:: |