Wenn ich einen XS-Code mit einem Hashwert schreibe, den ich nie in Perl erwarten würde, muss ich ihn dann freigeben? Wenn ja, wie?
Das, was mir am nächsten kommt, ist hv_undef, aber das löscht nur den Inhalt des Hash, nicht den Hash selbst, von dem, was ich verstehe.
%Vor% newHV
(wie newSV
, newAV
usw.) setzt den Referenzzähler für den neu erstellten Wert auf 1. Um ihn freizugeben, Sie müssen es nur auf 0 dekrementieren . Es gibt keine spezielle Funktion für HVs, also benutze SvREFCNT_dec
:
newHV
gibt eine HV
mit einer Referenzzahl (refcnt) von eins zurück und zeigt damit an, dass der Code in HV
gehalten wird. Wenn du mit HV
fertig bist, musst du den Hold aufheben, indem du refcnt dekrementierst. Es gibt drei gängige Möglichkeiten, dies zu tun.
Fertig damit hier und jetzt.
%Vor% AV
und HV
sind "Unterklassen" von SV
.
Fertig damit, nachdem der Anrufer die Möglichkeit hat, darauf zu verweisen. (Gilt nicht wirklich für Hashes.)
%Vor%Übertragen Sie "Besitz".
%Vor%Das ist die Abkürzung für
%Vor% Beachten Sie, dass Sie Ihren Zugriff auf die rv
ebenfalls freigeben müssen, wenn Sie damit fertig sind. Daher wird häufig Folgendes angezeigt:
Tags und Links memory-leaks perl perl-xs