1

文字列の配列を文字列のpythonリストに変換するために使用するCの次のルーチンがあります

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関数は指定された文字列のコピーを作成するので、不要な文字列がコピーされるたびに解放し、それらの文字列のポインターのコンテナーを解放します。これはすべてうまくいくようです。sys.getrefcountPython リストはスクリプトに返され、文字列はすべて適切に表示され、リスト内の文字列とリスト自体をチェックすると、参照カウントが適切に表示されます。

getrefcount の呼び出しによって一時的に 1 がインクリメントされるため、refcounts はすべて 2 を返します。コアダンプ分析に基づく参照カウントと関係があると確信しています

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

スクリプトの終了時にエラーが発生しており、ガベージ コレクターでクラッシュが発生していることを明確に確認できます。このエラーについて私が考えることができる唯一のことは、不適切な参照カウントです。

何かご意見は?

4

1 に答える 1

0

ガベージ コレクションとは直接関係ありませんが、Python バージョンのビルドに使用したのと同じコンパイラを使用していますか? 時にはそれが重要です。私は以前、数週間にわたって segfault をデバッグしていましたが、これは、MinGW を Microsoft Visual C++ Compiler for python に置き換えたときにのみ消えました。

于 2015-03-25T09:32:00.877 に答える