【问题标题】:Python C-extension class with a dynamic size具有动态大小的 Python C 扩展类
【发布时间】:2014-10-14 06:20:53
【问题描述】:

我尝试编写包含 python 类的 C 扩展。

该类将文件名作为构造函数的参数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 宏,但没有帮助。

你能给出一个线索或类似的例子吗?

【问题讨论】:

    标签: python c++ c segmentation-fault python-c-extension


    【解决方案1】:

    也许self->m_cfg需要先初始化?您正在对其调用 C++ 方法,但没有先调用其构造函数。 struct 是由 C 代码分配的,而不是 C++,所以它不知道需要构造这个字段。

    有一些方法可以手动调用构造函数(如果我没记错的话,类似new(&self->m_cfg) XmlConfig()),但最简单的可能是使用字段XmlConfig *cfg,并根据需要使用通常的语法分配和释放它C++ 运算符newdelete(后者要放在tp_dealloc 中)。

    【讨论】:

    • 非常感谢。我选择了new/delete 最简单的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    相关资源
    最近更新 更多