Am 27.03.2012 20:29, schrieb Bernd Nawothnig:
Aber viel mehr würde mich interessieren, ob PyList_SetItem und PyList_Append automatisch den Referenzzähler der eingefügten, bzw. zugewiesenen Objekte erhöhen. Ich vermute es stark, und die Extension funktioniert auch problemlos, was aber ja keineswegs eine Garantie auf Korrektheit ist, weil der GC asynchron zuschlagen kann (und dann müssen die Referenzzähler korrekt gesetzt sein). Und deswegen wüsste ich es gerne explizit.
Kann mir da einer was zu sagen? Siehe http://docs.python.org/c-api/list.html. PyList_SetItem stiehlt die Referenz, was hier aber OK ist, da Py_BuildValue ein neue Referenz liefert und auch die Referenz auf das ursprüngliche Objekt erhöht. PyList_Append erhöht den Zähler, so daß du den Count auf den Rückgabewert von VLP_asPyList selbst reduzieren musst. Aktuell hast du also ein Speicherleck.
Wenn du zuerst eine Liste mit der richtigen Länge anlegst und dann alles mit PyList_SetItem füllst, wirds auch noch ein bischen schneller. Der Grund für das abweichende Verhalten von PyList_SetItem steht hier: http://docs.python.org/c-api/intro.html#objects-types-and-reference-counts Few functions steal references; the two notable exceptions are PyList_SetItem() and PyTuple_SetItem(), which steal a reference to the item (but not to the tuple or list into which the item is put!). These functions were designed to steal a reference because of a common idiom for populating a tuple or list with newly created objects; for example, the code to create the tuple (1, 2, "three") could look like this (forgetting about error handling for the moment; a better way to code this is shown below): Gruß, Dietmar