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

Я пытаюсь написать 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 макрос, но это не помогает.

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

0

Решение

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

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

1

Другие решения


По вопросам рекламы [email protected]