XS Speicherleck in diesem Code?

8

In diesem Code kann der Speicherleck nicht gefunden werden.

Grundsätzlich möchte ich einen XS-Wrapper für eine C-Funktion schreiben, die ein zweidimensionales Array zurückgibt.

C-Funktion:

%Vor%

XS-Wrapper:

%Vor%

Ein "array of array" wird von XS zurückgegeben.

Testen in Perl-Skript:

%Vor%

Jedes Mal, wenn die Funktion returnArray() aufgerufen wird, steigt die Commit-Größe des Perl-Prozesses. Aber ich würde erwarten, dass die $arrayref Variable jedesmal Garbage Collection sein sollte und die Speicherbelegung nicht erhöht werden sollte.

Ich hoffe, ich befreie den gesamten zugewiesenen Speicher in XS. Aber immer noch gibt es ein Speicherleck. Was ist mit diesem XS-Code für Speicherverlust falsch?

    
InnovWelt 15.08.2013, 19:08
quelle

1 Antwort

7

Nun, das Muster von "create a template array, mach av_make() , dann befreie die Vorlage" ist nicht sehr gut - du wärst viel besser, wenn du einfach dein Array mit newAV() , av_extend() ing erstellst es auf die richtige Größe, und dann av_store(newSVnv(...)) für jedes Element zu tun. Dadurch können Sie die intermediären SVtempArray -Zuordnungen vollständig vermeiden.

Allerdings haben Sie das nicht gefragt. Ich denke, dein Problem besteht darin, dass du Safefree(SVArrays) ohne zuerst sv_free() jedes Elements verwendest. Da av_make() Duplikate den Inhalt des Quell-Arrays, AFAICT, lekken Sie die Referenz von

%Vor%

Sie müssen über SVArrays iterieren und sv_free() für jedes Element vor Safefree(SVArrays) aufrufen.

    
bks 19.08.2013, 03:08
quelle

Tags und Links