On 2012-03-27, Dietmar Schwertberger wrote:
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.
Ah, verstanden, gefixt und Danke für die Erklärung.
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.
Die inneren Listen erstelle ich bereits so, aber bei der äußeren würde das den C-Code unnötig verkomplizieren, denn ich kenne die wirkliche Länge erst ganz zum Schluss. Und auch das, was ich dann in C entsprechend machen müsste, wäre natürlich nicht kostenfrei. Nein, das ist unter dem Strich so schon die sauberste und auch naheliegendste Lösung. Bernd -- "Die Antisemiten vergeben es den Juden nicht, dass die Juden Geist haben - und Geld." [Friedrich Nietzsche]