使用绑定方法

时间:2018-06-18 14:41:50

标签: python python-3.x cpython python-c-api python-extensions

使用绑定方法的实例调用

PyObject_Call段错误,但在使用常规(未绑定)过程或使用实现__call__的类的实例或子类调用时工作正常type

它应该像这样工作,还是这个bug? v 3.5和3.6之间的行为是一致的。没有尝试过早期版本。

PS。在这种情况下生成的堆栈跟踪甚至不包含我的代码。但是,如果重要的话,崩溃发生在

method_dealloc () at Objects/classobject.c:194

如下所示:https://github.com/python/cpython/blob/master/Objects/classobject.c#L194

为了防止直接问题:是的,我在调用此程序之前调用Py_INCREF(callable)

更多信息

当我试着看看这次电话会议的内容时,我看到的是这样的话:

found method: <bound method DefParser.parse of <bound method DefParser.update_definition of <NULL>>>

DefParser.parseDefParser.update_definition并非完全随机,但也不完全相关:它们是最近调用的方法。即我怀疑PyObject_Call本身并不是有罪的,它只是表示方法对象的方式......出于某种原因,我似乎失去了引用,而是坚持垃圾......

1 个答案:

答案 0 :(得分:0)

大量调查发现了实际错误。最终它与PyObject_Call无关,但可能会帮助可能遇到这种情况的其他人。

PyObject_Call是分配内存的Python C API之一。 Python的内存分配器会机会性地调用GC。我不确定何时决定执行此操作,但最终会发生。然后,GC将尝试释放Python对象分配的内存。

在我的情况下发生了什么:使用常规malloc分配了一个字符串,其中我错误地计算了终止空字节的位置(在某些情况下,它将在我请求分配的内存之后出现一个位置)。然后,该内存用于创建Python bytes对象。稍后,当GC取消分配该对象时,它将发生seagfault。