Я пытаюсь написать 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
но это не помогает.
Можете ли вы дать подсказку или работать с аналогичным примером?
Может быть, self->m_cfg
нужно сначала инициализировать? Вы вызываете на него метод C++, но сначала не вызываете его конструктор. Структура выделяется кодом C, а не C++, поэтому она не знает, что ей нужно построить это поле.
Есть способы вручную вызвать конструктор (что-то вроде new(&self->m_cfg) XmlConfig()
если я правильно помню), но самый легкий, вероятно, должен иметь поле XmlConfig *cfg
, а также выделять и освобождать его по мере необходимости с обычным синтаксисом операторов C++ new
и delete
(последний должен быть помещен в tp_dealloc
).
new
/delete
.