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

标签 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_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;
}

PyString_FromStringAndSize 函数复制给定的字符串,因此我在复制时释放不必要的字符串,然后释放这些字符串指针的容器。这一切似乎工作正常。 python 列表返回给脚本,所有字符串看起来都不错,通过 sys.getrefcount 检查列表中的字符串和列表本身时,refcounts 看起来也不错。

refcounts 全部返回 2,这似乎是正确的,因为对 getrefcount 的调用导致暂时增加 1。我很确定这与基于核心转储分析的引用计数有关

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

错误发生在脚本退出时,您可以清楚地看到崩溃发生在垃圾收集器中。错误的重新计数是我唯一能想到的错误。

有什么想法吗?

最佳答案

与垃圾收集没有直接关系,但您使用的是用于构建 Python 版本的同一编译器吗?有时这很重要。我曾经调试过几个星期的段错误,只有当我用适用于 python 的 Microsoft Visual C++ 编译器替换 MinGW 时,它才消失。

关于python - 由于垃圾收集错误,c python 扩展导致 python 脚本以段错误退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29250982/

相关文章:

python - 如何调整我的输入数据以便在 keras 中与 Conv1D 一起使用?

c# - 创建和写入 XML 文件抛出异常 -> 系统内存不足异常?

python - 什么会影响超过 64 个字符的字符串的 Python 字符串比较性能?

python - 如何在 Anaconda 中拥有两个不同的环境? (Python 3.7,一种 32 位,一种 64 位)

python - 动画网络图以显示算法的进度

c++ - openCV/图像处理中创建 MAT 类型的 3 维数组时出现段错误

c - 从结构队列中删除所有节点

c - 做 while 和右移没有效果

java - 即使一个对象引用了其他对象,它是否也不会被GC?

java - 什么时候在java中对字符串进行垃圾收集