2

Pythonリストを作成し、それにデータ項目を追加するコードがいくつかあります。私たちの懸念は、データ項目の1つがNULLであることが判明した場合、リスト全体(つまり、以前に追加された項目)は無価値であると見なし、リストとそのメモリを解放したいということです。ガベージコレクターがすべてのメモリを解放するようにするには、何をする必要がありますか?

現在のコードは次のとおりです。

PyObject* retval = PyList_New(0);

QList<QVariant> varList = value.toList();
foreach(QVariant var, varList)
{
    // variantToPython(var) returns either NULL
    // or a valid object whose reference count is 1
    PyObject *pyVar = variantToPython(var);
    if (pyVar)
    {
        PyList_Append(retval, pyVar);
        Py_DECREF(pyVar);
    }
}

return retval;

しかし、私たちはこのようなことをしたいと思います:

PyObject* retval = PyList_New(0);

QList<QVariant> varList = value.toList();
foreach(QVariant var, varList)
{
    // variantToPython(var) returns either NULL
    // or a valid object whose reference count is 1
    PyObject *pyVar = variantToPython(var);
    if (pyVar)
    {
        PyList_Append(retval, pyVar);
        Py_DECREF(pyVar);
    }
    else
    {
        Py_DECREF(retval);
        retval = 0;
        break;
    }
}

return retval;

では、リストオブジェクトのDECREFは、GCがすべてを解放するのに十分ですか?

4

1 に答える 1

2

はい、PyList_New()refcountが1のオブジェクトを作成するためです。ただし、戻る前に適切な例外を設定する必要があります。

于 2012-07-26T09:31:05.183 に答える