Должен ли я вызвать delete или Py_XDECREF для класса C ++ в Custom_dealloc для расширений Python C? - PullRequest
0 голосов
/ 20 мая 2019

Если у меня следующая конфигурация:

#include "custom.hpp"

typedef struct
{
    PyObject_HEAD
    FastFile* cppobjectpointer;
}
PyFastFile;

static int PyFastFile_init(PyFastFile *self, PyObject *args, PyObject *kwds) {
    self->cppobjectpointer = new FastFile( filepath );
    return 0;
}

Как мне освободить мою cppobjectpointer?

Должен ли я сделать это:

static void PyFastFile_dealloc(PyFastFile * self)
{
    delete self->cppobjectpointer;
    Py_TYPE(self)->tp_free( (PyObject *) self );
}

Или это:

static void PyFastFile_dealloc(PyFastFile * self)
{
    Py_XDECREF(self->cppobjectpointer);
    Py_TYPE(self)->tp_free( (PyObject *) self );
}

Ссылки:

  1. Как обернуть объект C ++, используя чистый API расширения Python (python3)?
  2. https://pythonextensionpatterns.readthedocs.io/en/latest/refcount.html
  3. Когда Py_INCREF?
  4. https://docs.python.org/3/extending/extending.html#ownership-rules
  5. Где я должен поместить Py_INCREF и Py_DECREF в этот блок в расширении Python C?
...