Главная страница


ru.perl

 
 - RU.PERL ----------------------------------------------------------------------
 From : Andrey Sapozhnikov                   2:5020/400     01 Aug 2003  20:22:21
 To : Denis Nikiforov
 Subject : Re: несколько вопросов...
 -------------------------------------------------------------------------------- 
 
 Denis Nikiforov wrote:
 
 > Hello, Artem!
 > You wrote to "Denis Nikiforov" on Fri, 01 Aug 2003 15:59:10 +0600:
 > 
 >  DN>> 1)
 >  DN>> если создать объект некоторого класса и не записать ссылку на него в
 >  DN>> конкретную переменную:
 >  DN>> HTML::LinkExtor->new();
 >  DN>> то как долго проживёт этот объект?
 > 
 >  DN>> если я, например, в цикле создаю такие "анонимные" объекты:
 >  DN>> for (;;) {
 >  DN>>     HTML::LinkExtor->new();
 >  DN>> }
 >  DN>> то они скапливаются где-то в памяти или уничтожаются по завершении
 >  DN>> каждой итерации цикла, или по завершении всего цикла?
 > 
 >  AC> Как придется. Hе следует полагаться как на то, что они будут уничтожены
 >  AC> сразу по окончании оператора (а отнюдь не итерации цикла), так и на то,
 >  AC> что они доживут до конца цикла. Тем более что до конца вечного цикла
 >  AC> дожить невозможно. Hо скорее всего, на практике будут убиваться по
 >  AC> завершении каждой итерации цикла.
 > 
 > понятно, такая неопределённость, имхо, не красит язык/интерпретатор
 
 perldoc perltoot
 ...
   Perl's notion of the right time to call a destructor is not
   well-defined currently, which is why your destructors should not rely
   on when they are called.
 ...
   In really good object-oriented programming languages, the user doesn't
   care when the destructor is called.  It just happens when it's supposed
   to.  In low-level languages without any GC at all, there's no way to
   depend on this happening at the right time, so the programmer must
   explicitly call the destructor to clean up memory and state, crossing
   their fingers that it's the right time to do so.   Unlike C++, an
   object destructor is nearly never needed in Perl, and even when it is,
   explicit invocation is uncalled for.  In the case of our Person class,
   we don't need a destructor because Perl takes care of simple matters
   like memory deallocation.
 ...
 
 подытоживая сказанное - сборщик мусора почистит Ваши объекты как
 только сочтет это нужным но не ранее того, как пропадет последняя
 ссылка на Ваш объект.
 
 А еще (это я уже от себя) она может пропасть позже чем Вы думаете.
 Hапример Вы написали нечто в последней строке функции, от которой
 не ждете никакого возвращаемого значения. Однако значения последнего
 выражения (кстати, Вы тоже можете не предполагать, что данное
 выражение возвращает значение. Hапример my $x = Class->new; не
 только присваивает переменной $x значение, но и возвращает его)
 будет помещено в стек возвращаемых значений и разрушение объекта
 будет отложено.
 
 Если разрушение в указанный момент так важно по каким-либо причинам,
 опишите его как собственный метод (скажем close, stop или finish) и
 вызывайте явно. Сборщик мусора в Perl потом подберет "пустую шкурку
 мертвого объекта".
 
 -- 
 Андрей
 
 --- ifmail v.2.15dev5
  * Origin: Demos online service (2:5020/400)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Re: несколько вопросов...   Andrey Sapozhnikov   01 Aug 2003 20:22:21 
 Re: несколько вопросов...   Denis Nikiforov   01 Aug 2003 23:58:35 
Архивное /ru.perl/65775f89142e.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional