Muss ich eine mit newHV erstellte HV * freigeben?

8

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%     
Eugene Marcotte 24.12.2012, 19:46
quelle

2 Antworten

10

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 :

%Vor%     
Ilmari Karonen 24.12.2012, 21:46
quelle
7

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.

  1. Fertig damit hier und jetzt.

    %Vor%

    AV und HV sind "Unterklassen" von SV .

  2. Fertig damit, nachdem der Anrufer die Möglichkeit hat, darauf zu verweisen. (Gilt nicht wirklich für Hashes.)

    %Vor%
  3. Ü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:

    %Vor%
ikegami 25.12.2012 04:50
quelle

Tags und Links