7 Stimmen

Wie kann ich Verweise auf Perl-Objekte verfolgen?

Ich versuche, meinen Code zu reparieren, um Perl zu ermöglichen, unbenötigte Daten wiederherzustellen, indem Verweise geschwächt und Zyklen unterbrochen werden.

Ich habe kürzlich eine Frage auf Wie kann ich auf Perl-Refcounts zugreifen gestellt und die Antwort funktioniert gut für mich.

Bei einigen meiner Objekte ist die Referenzzählung > 1 und ich weiß nicht warum.

Gibt es eine Möglichkeit für mich, einen Rückruf oder Ähnliches hinzuzufügen, um zu wissen, wann eine Referenzzählung erhöht wird? Ich möchte wissen, wer auf ein Objekt verweist.

5voto

mob Punkte 113680

Implementiere ein Devel::XXX Paket, das die Refcounts deiner Objekte überprüft?

package Devel::Something;
# hier wird nur Devel::Trace emuliert
# siehe http://cpansearch.perl.org/src/MJD/Devel-Trace-0.10/Trace.pm
sub DB::DB {
    if ($Devel::Something::CHECK) {
        my ($package, $file, $linenumber) = caller;
        ... überprüfe aktuelle Refcounts
        ... wenn sich welche geändert haben, gib die Details aus
        ... inklusive aktuellem Paket/Datei/Zeilennummer
        $Devel::Something::CHECK = 0;  # deaktiviere es bis es wieder aktiviert ist
    }
}
1;

# mein Programm
... mache etwas ...
$Devel::Something::CHECK = 1;
... mache noch mehr ...
$Devel::Something::CHECK = 1;

$ perl -d:Something my_program.pl ...

Du könntest $Devel::Something::CHECK = 1 Statements an geeigneten Stellen im Code einfügen, oder die Bedingung in DB::DB ändern, um in regelmäßigen Abständen zu laufen (z.B. if (++$Devel::Something::CHECK % 100 == 0) { um nach jeder 100 Aussagenauswertung zu überprüfen).

0voto

Leon Timmermans Punkte 29718

Perl-Werte verfolgen nur ihre schwachen Referenzen, nicht ihre harten. Es scheint keinen Weg zu geben, einen Rückruf für so etwas hinzuzufügen. Sie müssen die refcounts selbst überprüfen und Ihre Berechnungen darüber durchführen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X