由于垃圾收集错误,c python扩展导致python脚本以segfault退出

由于垃圾收集错误,c python扩展导致python脚本以segfault退出,python,c,garbage-collection,segmentation-fault,refcounting,Python,C,Garbage Collection,Segmentation Fault,Refcounting,我用C编写了以下例程,用于将字符串数组转换为python字符串列表 PyObject* build_pylist(char** strings, unsigned int string_cnt){ PyObject* list = PyList_New(string_cnt); int i; for(i = 0; i < string_cnt; i++){ PyObject* pystring = PyString_FromStringAndSi

我用C编写了以下例程,用于将字符串数组转换为python字符串列表

PyObject* build_pylist(char** strings, unsigned int string_cnt){

    PyObject* list = PyList_New(string_cnt);
    int i;
    for(i = 0; i < string_cnt; i++){

        PyObject* pystring = PyString_FromStringAndSize(
            (const char*) strings[i], 
            (Py_ssize_t) strlen(strings[i])
        );

        #per http://www.kbs.twi.tudelft.nl/Documentation/Programming/python-2.1/ext/thinIce.html
        #apparently the inc/dec is necessary...doesn't seem
        #to make a difference

        Py_INCREF(pystring);
        PyList_SET_ITEM(
            list, 
            (Py_ssize_t) i, 
            pystring
        );
        Py_DECREF(pystring);

        free(strings[i]);
    }

    free(strings);
    return list;
}
错误发生在脚本的出口处,您可以清楚地看到崩溃发生在垃圾收集器中。错误的重新计数是我唯一能想到的错误


有什么想法吗?

与垃圾收集没有直接关系,但您使用的编译器是否与构建python版本时使用的编译器相同?有时候这很重要。我曾经调试segfault好几个星期,直到我用Microsoft Visual C++编译器for python替换MinGW后,它才消失。

不走运。我不确定我的python是用哪个编译器编译的,所以我尝试了所有的编译器,得到了相同的结果。
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0   org.python.python               0x000000010abfc52a collect + 482
1   org.python.python               0x000000010abfc33f PyGC_Collect + 35
2   org.python.python               0x000000010abea056 Py_Finalize + 290
3   org.python.python               0x000000010abfbe9b Py_Main + 3143
4   libdyld.dylib                   0x00007fff8843a7e1 start + 1