2015-03-25 44 views
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是我能想到的唯一的這個錯誤。

有什麼想法?

回答

0

不直接相關的垃圾收集,但是否使用了用於構建你的Python版本相同的編譯器?有時候很重要。我曾經調試過幾周的segfault,只有當我用Microsoft Visual C++編譯器替換了MinGW for python時,它才消失。

+0

沒有運氣。不知道我的python編譯的是哪個編譯器,所以我試了一下,得到了相同的結果。 – Tommy 2015-03-25 19:18:09