Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update PyObject_Del() documentation #122597

Merged
merged 1 commit into from
Aug 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 1 addition & 6 deletions Doc/c-api/allocation.rst
Original file line number Diff line number Diff line change
Expand Up @@ -54,12 +54,7 @@ Allocating Objects on the Heap

.. c:function:: void PyObject_Del(void *op)

Releases memory allocated to an object using :c:macro:`PyObject_New` or
:c:macro:`PyObject_NewVar`. This is normally called from the
:c:member:`~PyTypeObject.tp_dealloc` handler specified in the object's type. The fields of
the object should not be accessed after this call as the memory is no
longer a valid Python object.

Same as :c:func:`PyObject_Free`.

.. c:var:: PyObject _Py_NoneStruct

Expand Down
6 changes: 3 additions & 3 deletions Doc/c-api/memory.rst
Original file line number Diff line number Diff line change
Expand Up @@ -734,7 +734,7 @@ The same code using the type-oriented function set::
return PyErr_NoMemory();
/* ...Do some I/O operation involving buf... */
res = PyBytes_FromString(buf);
PyMem_Del(buf); /* allocated with PyMem_New */
PyMem_Free(buf); /* allocated with PyMem_New */
return res;

Note that in the two examples above, the buffer is always manipulated via
Expand All @@ -750,11 +750,11 @@ allocators operating on different heaps. ::
...
PyMem_Del(buf3); /* Wrong -- should be PyMem_Free() */
free(buf2); /* Right -- allocated via malloc() */
free(buf1); /* Fatal -- should be PyMem_Del() */
free(buf1); /* Fatal -- should be PyMem_Free() */

In addition to the functions aimed at handling raw memory blocks from the Python
heap, objects in Python are allocated and released with :c:macro:`PyObject_New`,
:c:macro:`PyObject_NewVar` and :c:func:`PyObject_Del`.
:c:macro:`PyObject_NewVar` and :c:func:`PyObject_Free`.

These will be explained in the next chapter on defining and implementing new
object types in C.
2 changes: 1 addition & 1 deletion Modules/_sre/sre.c
Original file line number Diff line number Diff line change
Expand Up @@ -530,7 +530,7 @@ state_fini(SRE_STATE* state)
PyBuffer_Release(&state->buffer);
Py_XDECREF(state->string);
data_stack_dealloc(state);
/* See above PyMem_Del for why we explicitly cast here. */
/* See above PyMem_Free() for why we explicitly cast here. */
PyMem_Free((void*) state->mark);
state->mark = NULL;
}
Expand Down
16 changes: 8 additions & 8 deletions Modules/_testcapi/heaptype.c
Original file line number Diff line number Diff line change
Expand Up @@ -269,16 +269,16 @@ test_type_from_ephemeral_spec(PyObject *self, PyObject *Py_UNUSED(ignored))
// (Explicitly overwrite memory before freeing,
// so bugs show themselves even without the debug allocator's help.)
memset(spec, 0xdd, sizeof(PyType_Spec));
PyMem_Del(spec);
PyMem_Free(spec);
spec = NULL;
memset(name, 0xdd, sizeof(NAME));
PyMem_Del(name);
PyMem_Free(name);
name = NULL;
memset(doc, 0xdd, sizeof(DOC));
PyMem_Del(doc);
PyMem_Free(doc);
doc = NULL;
memset(slots, 0xdd, 3 * sizeof(PyType_Slot));
PyMem_Del(slots);
PyMem_Free(slots);
slots = NULL;

/* check that everything works */
Expand All @@ -304,10 +304,10 @@ test_type_from_ephemeral_spec(PyObject *self, PyObject *Py_UNUSED(ignored))

result = Py_NewRef(Py_None);
finally:
PyMem_Del(spec);
PyMem_Del(name);
PyMem_Del(doc);
PyMem_Del(slots);
PyMem_Free(spec);
PyMem_Free(name);
PyMem_Free(doc);
PyMem_Free(slots);
Py_XDECREF(class);
Py_XDECREF(instance);
Py_XDECREF(obj);
Expand Down
Loading