Вопрос по perl, oop – Как вы явно уничтожаете объект в Perl?

14

Допустим, у меня есть класс Perl, у которого есть метод DESTROY. Этот метод используется для неявного освобождения внешнего ресурса, такого как дескриптор файла или транзакция базы данных.

Учитывая экземпляр этого класса, я хотел бы явно уничтожить его. Основная цель этого - вызвать метод DESTROY для освобождения внешнего ресурса. Тем не менее, наличие «объекта» само освобождение из памяти будет дополнительным преимуществом.

Как я могу это сделать? Я рассмотрел прямой вызов метода DESTROY и определение любых переменных, которые ссылаются на объект.

Ваш Ответ

2   ответа
4

undef явно уничтожить объект. Код ниже иллюстрирует это.

package MyPackage;

sub new {
    print "In new\n";
    return bless {};
}

sub DESTROY {
    print "In DESTROY\n";
}

package main;

my $Obj = MyPackage->new();
<STDIN>;
undef $Obj;
<STDIN>;
undefError: User Rate Limit Exceededmy $Cpy = $Obj;Error: User Rate Limit ExceededundefError: User Rate Limit Exceeded
17

как только исчезает последняя ссылка на них, если только у вас нет самоссылочных структур (см.деструкторы иTwo phase garbage collection пункт после этого для некоторой интересной информации).

Если у вас нет собственных ссылок, вам не нужно беспокоиться ни о чем,DESTROY метод будет вызван, когда это необходимо; попытка самоуничтожения объекта не будет безопасной (как вы можете быть уверены, что объект не ссылается где-то еще), если только вы не выполняете подсчет ссылок самостоятельно (если это действительно возможно и это будет дублировать perl '); усилия, что не очень хорошая идея).

Так что я бы сказал, если у вас нет циклических ссылок:

If you want to release external resources at a specific point in your code, do so explicitly with a release/close/dispose/whatever method (that your DESTROY code could call too). If you don't really care that that release happens exactly at that point in your code, just that it does get called eventually, don't worry about it. Don't worry about the perl object itself.

Если у вас есть циклические ссылки, вам нужно быть намного более осторожным и использовать слабые ссылки (см.Scalar::Utilразорвать циклы.

(Другими словами, я не знаю способа явноdelete объект perl. Это не очень хорошо работает с системой сбора мусора с подсчетом ссылок.)

Error: User Rate Limit Exceeded Sam
Error: User Rate Limit Exceeded

Похожие вопросы