C-расширение класса Python с динамическим размером

0

Я пытаюсь написать C-расширение, которое содержит класс python.

Этот класс принимает имя файла как параметр fname конструктора, затем загружает этот файл в память и сохраняет его как конфигурацию.

Ниже того, что у меня есть:

typedef struct {
    PyObject_HEAD
    XmlConfig m_cfg;
} PyAgent;

static int PyAgent_init(PyAgent *self, PyObject *args) {
    const char *fname;
    if (!PyArg_ParseTuple(args, "s", &fname)) {
    return NULL;
    }
    self->m_cfg.Load(fname);
    return 0;
}

static PyTypeObject PyAgentType = {
   PyObject_HEAD_INIT(NULL)
   0,                                            /* ob_size */
   "classify.Agent",                             /* tp_name */
   ...
}
...

Когда я пытаюсь загрузить файл, возникает ошибка сегментации. Насколько я понимаю, это происходит потому, PyAgent struct имеет размер объекта, который увеличивается из-за выделения памяти для файла.

Я попытался использовать макрос PyObject_VAR_HEAD но это не помогает.

Можете ли вы дать подсказку или работать с аналогичным примером?

Теги:
segmentation-fault
python-c-extension

1 ответ

1
Лучший ответ

Может быть, self->m_cfg нужно сначала инициализировать? Вы вызываете на него метод C++, но сначала не вызываете его конструктор. Структура выделяется кодом C, а не C++, поэтому она не знает, что ей нужно построить это поле.

Есть способы вручную вызвать конструктор (что-то вроде new(&self->m_cfg) XmlConfig() если я правильно помню), но самый легкий, вероятно, должен иметь поле XmlConfig *cfg, а также выделять и освобождать его по мере необходимости с обычным синтаксисом операторов C++ new и delete (последний должен быть помещен в tp_dealloc).

  • 0
    Спасибо большое. Я выбрал самый простой способ с new / delete .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню