Python扩展方法中的分段错误

2024-09-28 21:03:11 发布

您现在位置:Python中文网/ 问答频道 /正文

< P>我一直在研究Python C/C++扩展,我设法让所有的东西都工作到目前为止,除了一种方法,它添加了两个结构,称为“IntObjo”,里面有一个整数,并返回一个新的结构,称为“AddioTythObjo”。在

到目前为止,这个扩展只有两个方法,“value”可以完美地工作,而“add”是有问题的方法。在

我用下面的方法来测试它测试.py脚本:

import intobj
val1 = intobj.IntObj(3)
val2 = intobj.IntObj(5)
print "Val1"
print val1
print "Val1 Value"
print val1.value()
print "Val2"
print val2
print "Val2 Value"
print val2.value()
val3 = intobj.add(val1, val2)
print "Val3"
print val3
print "Val3 Value"
print val3.value()

执行时,我得到以下输出:

^{pr2}$

处理添加这两个结构的扩展方法是:

static PyObject *IntObj_add(PyObject *self,PyObject *args)
{
    std::cout<<"IntObj_add start"<<std::endl;

    PyObject *a,*b;

    IntObj *result;

    if (!PyArg_ParseTuple(args, "OO", &a, &b))
            return NULL;

    std::cout<<"Int Obj Value A: "<<int_obj_value(((IntObj*)a)->content)<<std::endl;
    std::cout<<"Int Obj Value B: "<<int_obj_value(((IntObj*)b)->content)<<std::endl;

    result = new IntObj;

    Py_INCREF(result);

    result->content = add_int_obj(((IntObj*)a)->content,((IntObj*)b)->content);

    std::cout<<"Int Obj Value Result: "<<int_obj_value(result->content)<<std::endl;

    std::cout<<"IntObj_add end"<<std::endl;

    return (PyObject*)result;
}

由于分段错误只在我尝试打印对象时发生在方法外部,而不是在我试图获取值时,我猜测垃圾收集器正在删除该方法尝试返回的PyObject。在

如何安全地返回结果对象?在


Tags: 方法addvalueresultcontentpyobjectstdprint
1条回答
网友
1楼 · 发布于 2024-09-28 21:03:11
由于@ USER语言的注释和一些对我的C/C++的阅读,我记得在使用之前可以定义方法,这样我可以用以下方式解决问题:

我在文件的开头定义了我的方法,如下所示:

static PyObject *IntObj_add(PyObject *, PyObject *);

然后在实现PyTypeObject之后,我实现了一个方法,创建了一个调用type对象的对象,而不是new,如下所示:

^{pr2}$

相关问题 更多 >