1
我在C以下的常规,我用它来把字符串数组转换为字符串C Python而伸出使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列表生成给定字符串的副本,因此我将这些不必要的字符串复制出来,然后释放这些字符串指针的容器。这一切似乎都很好。 Python列表返回到脚本,所有字符串看起来都很好,并且通过sys.getrefcount
对列表中的字符串和列表本身进行检查时,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
的错误是在脚本的退出发生,你可以清楚地看到飞机坠毁在垃圾收集发生。错误的refcounting是我能想到的唯一的这个错误。
有什么想法?
没有运气。不知道我的python编译的是哪个编译器,所以我试了一下,得到了相同的结果。 – Tommy 2015-03-25 19:18:09