Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > ХЭШ и Указатели


Автор: mastercz 20.3.2009, 08:25
Вот я тут задумался, и понял что непонимаю. 
Какая принципиальная разница между двумя назначениями:
Код

$hash{a}='Вася';
$hash->{a}='Вася';


И еще в дополнение к вопросу:
Может ли другая переменная занять область памяти, если переменная ее занимавшая уже не существует а жесткая ссылка на нее еще существует.
Пример:
Код


my $link;
 {
   my $var = 10;
   $link = \$var;
 }
print 'Переменная $var = ', $var."\n";
print 'Значение ссылки = ', $$link."\n";  



Автор: SkoobyDoo 20.3.2009, 09:24
Код

$hash{a}='Вася';
$hash->{a}='Вася';

Первая запись, это типичная запись хэша, когда элементу присваивается значение. Во втором же случае, присваивается значение элементу анонимного хэша, то есть в переменной $hash хранится ссылка на анонимный хэш.

Добавлено @ 09:38
Код

my $link;
{
   my $var = 10;
   $link = \$var;
}
print 'Переменная $var = ', $var."\n";
print 'Значение ссылки = ', $$link."\n";  

Выполните скрипт и вам станет ясно smile

Автор: mastercz 20.3.2009, 09:59
SkoobyDoo, я наверно не точно задал ворос.
Вопрос следующий, если я получаю (неважно как, не важно откуда, допустим из тогоже XML:Simple) анонимный хэшь, или создаю его сам.
То, ячейки памяти анонимного хэша защищенны от их захвата (изменения) какой либо другой переменной или нет. Возможна ли ситуация, когда вновь обьявленная переменная займет ту - же память, что и анонимный массив? 
P.S. пример, выше, я специально привел, чтобы показать, что переменная уже не существует а в ячейке памяти храниться ее значение. И поидеи эта память свободна ... или ... если к этой области памяти привязанна жесткая ссылка, то это приравниваеться к зарезервированной области памяти ?

Автор: NuINu 20.3.2009, 11:42
Цитата(mastercz @  20.3.2009,  07:59 Найти цитируемый пост)
И поидеи эта память свободна 

нет это не верно, память не свободна до тех пор пока существует хотябы одна ссылка на нее.

и собственно не понятно, чего это вас так волнует свбодность памяти? 
Цитата(mastercz @  20.3.2009,  07:59 Найти цитируемый пост)
если я получаю (неважно как, не важно откуда, допустим из тогоже XML:Simple) анонимный хэшь, или создаю его сам.
То, ячейки памяти анонимного хэша защищенны от их захвата (изменения) какой либо другой переменной или нет

что значит защищены? что значит захват? вы чего собственно добиваетесь?

Автор: SkoobyDoo 20.3.2009, 11:56
mastercz, 
вас волнует утечка памяти?

интересные заметки:
http://www.opennet.ru/base/dev/perl_memory_leak.txt.html
http://xpoint.ru/know-how/Perl/UtechkiPamyati

Автор: tolkien 20.3.2009, 13:35
Цитата(mastercz @ 20.3.2009,  09:59)
SkoobyDoo, я наверно не точно задал ворос.
Вопрос следующий, если я получаю (неважно как, не важно откуда, допустим из тогоже XML:Simple) анонимный хэшь, или создаю его сам.
То, ячейки памяти анонимного хэша защищенны от их захвата (изменения) какой либо другой переменной или нет. Возможна ли ситуация, когда вновь обьявленная переменная займет ту - же память, что и анонимный массив? 
P.S. пример, выше, я специально привел, чтобы показать, что переменная уже не существует а в ячейке памяти храниться ее значение. И поидеи эта память свободна ... или ... если к этой области памяти привязанна жесткая ссылка, то это приравниваеться к зарезервированной области памяти ?

Если на ячейку памяти нет ни одной ссылки. То Perl освобождает данную память. Покрайней мере мы должны думать что он ее освободит. На самом деле он может ее освободить или не освободить. Это как его создатели запрограммировали. В целях каких нибудь оптимизацией, например в целях быстродействия. Могут память не освобождать, а использовать ее повторно. 

Автор: vadiml 22.3.2009, 17:06
> $hash{a}='Вася';
> $hash->{a}='Вася';

В реальности переменная перла -- это С структура.
Если отбросить адрес расположения строки 'Вася', то первый хеш от второго отличается только 1 флагом в этой структуре, т.е. для Вас -- разница в написании, для самого перла -- практически ни какой.
Только вот Вам главное при передаче в функцию/из функции этого хеша не забывать в каком случае Вы передадите указатель на хеш, а в каком его содержимое.

Автор: mastercz 23.3.2009, 04:17
Спасибо всем за помощь. Узнал для себя много нового.
В частности любопытная информация по утечки памяти. Хотя я видимо чего-то не допонимаю
в частности почему в случае :
Код

while (1) { my ($a,$b); $a=\$b; $b=\$a;}

Память не освобождаеться, а в случае
Код

while (1) { my ($a,$b); $b=\$a; }

она освобождаеться.
Так-же заставил задуматься код из примера статьи предложенной SkoobyDoo,
почему тут не возникает утечки памяти, если я обнуляю сылку в копии массива:
Код

      sub create_ring 
      {
             my ($length)=@_;
             my @ring=({'value' => 0})x$length;

                for (my $i=0; $i<$length; $i++) 
            {
                         $ring[$i]{'next_ref'}=$ring[($i+1)%$length];
                
                     }
              return @ring;
           }

while (1) { 
        my $ring=create_ring(10);
        $ring[0]{'next_ref'}=undef;
      }



Автор: GoDleSS 23.3.2009, 11:05
Цитата

Спасибо всем за помощь. Узнал для себя много нового.
В частности любопытная информация по утечки памяти. Хотя я видимо чего-то не допонимаю
в частности почему в случае :
Код

while (1) { my ($a,$b); $a=\$b; $b=\$a;}

Память не освобождаеться, а в случае
Код

while (1) { my ($a,$b); $b=\$a; }

она освобождаеться.

Ничего любопытного:
1. Закольцеванный ссылки (кросс-линк).
2. Ссылки, которые далее не используются.
Сборщик мусора, реализованный в перле, не умеет бороться с кросс-линками по прострой причине - он работает именно с ссылками, которые далее не пользуются в программе, а в случае с кросс-линками получается, что они ссылаются друг на друга и "в лоб" невозможно определить их дальнейшее "бесполезность".

Автор: vadiml 23.3.2009, 20:36
>  while (1) { my ($a,$b); $a=\$b; $b=\$a;}

$a и $b имеют по 2 ссылки, каждая из которых держит другую.
Освободиться они могут на более высоком уровне, но для этого надо выйти за пределы текущего рабочего блока, что бы он весь вышел за пределы видимости.
Подробнее -- посмотрите замыкания, типа:
sub qq = {my @a = (1, 2, 3); return \@a};
Как долго по Вашему будет жить массив $a?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)