mirror of
https://github.com/pybind/pybind11.git
synced 2024-11-29 00:22:00 +00:00
Make sure to properly untrack gc objects before freeing them (#4461)
* Make sure to properly untrack gc objects before freeing them * style: pre-commit fixes * Fix lint * Add comment about where the original track comes from Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
This commit is contained in:
parent
e53d58af6c
commit
c709d2a83e
@ -445,9 +445,17 @@ inline void clear_instance(PyObject *self) {
|
|||||||
/// Instance destructor function for all pybind11 types. It calls `type_info.dealloc`
|
/// Instance destructor function for all pybind11 types. It calls `type_info.dealloc`
|
||||||
/// to destroy the C++ object itself, while the rest is Python bookkeeping.
|
/// to destroy the C++ object itself, while the rest is Python bookkeeping.
|
||||||
extern "C" inline void pybind11_object_dealloc(PyObject *self) {
|
extern "C" inline void pybind11_object_dealloc(PyObject *self) {
|
||||||
|
auto *type = Py_TYPE(self);
|
||||||
|
|
||||||
|
// If this is a GC tracked object, untrack it first
|
||||||
|
// Note that the track call is implicitly done by the
|
||||||
|
// default tp_alloc, which we never override.
|
||||||
|
if (PyType_HasFeature(type, Py_TPFLAGS_HAVE_GC) != 0) {
|
||||||
|
PyObject_GC_UnTrack(self);
|
||||||
|
}
|
||||||
|
|
||||||
clear_instance(self);
|
clear_instance(self);
|
||||||
|
|
||||||
auto *type = Py_TYPE(self);
|
|
||||||
type->tp_free(self);
|
type->tp_free(self);
|
||||||
|
|
||||||
#if PY_VERSION_HEX < 0x03080000
|
#if PY_VERSION_HEX < 0x03080000
|
||||||
|
Loading…
Reference in New Issue
Block a user