Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ХЭШ и Указатели 
:(
    Опции темы
mastercz
Дата 20.3.2009, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



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

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


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


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




Это сообщение отредактировал(а) mastercz - 20.3.2009, 09:22
PM MAIL   Вверх
SkoobyDoo
Дата 20.3.2009, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 4.10.2007

Репутация: нет
Всего: нет



Код

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

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

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

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

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

Это сообщение отредактировал(а) SkoobyDoo - 20.3.2009, 09:58
PM MAIL   Вверх
mastercz
Дата 20.3.2009, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



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

PM MAIL   Вверх
NuINu
Дата 20.3.2009, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 19.7.2008

Репутация: 5
Всего: 6



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

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

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

что значит защищены? что значит захват? вы чего собственно добиваетесь?
PM MAIL   Вверх
SkoobyDoo
Дата 20.3.2009, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 4.10.2007

Репутация: нет
Всего: нет



mastercz
вас волнует утечка памяти?

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

Это сообщение отредактировал(а) SkoobyDoo - 20.3.2009, 11:59
PM MAIL   Вверх
tolkien
Дата 20.3.2009, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 5.4.2008

Репутация: 4
Всего: 4



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

Если на ячейку памяти нет ни одной ссылки. То Perl освобождает данную память. Покрайней мере мы должны думать что он ее освободит. На самом деле он может ее освободить или не освободить. Это как его создатели запрограммировали. В целях каких нибудь оптимизацией, например в целях быстродействия. Могут память не освобождать, а использовать ее повторно. 
PM MAIL   Вверх
vadiml
Дата 22.3.2009, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 27.7.2007

Репутация: 5
Всего: 7



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

В реальности переменная перла -- это С структура.
Если отбросить адрес расположения строки 'Вася', то первый хеш от второго отличается только 1 флагом в этой структуре, т.е. для Вас -- разница в написании, для самого перла -- практически ни какой.
Только вот Вам главное при передаче в функцию/из функции этого хеша не забывать в каком случае Вы передадите указатель на хеш, а в каком его содержимое.
PM MAIL Jabber   Вверх
mastercz
Дата 23.3.2009, 04:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



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

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;
      }




Это сообщение отредактировал(а) mastercz - 23.3.2009, 04:18
PM MAIL   Вверх
GoDleSS
Дата 23.3.2009, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 11.2.2007
Где: Пироговский

Репутация: 2
Всего: 2



Цитата

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

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

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

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

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

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


Это сообщение отредактировал(а) GoDleSS - 23.3.2009, 11:40
--------------------
It's a nice day to die my friend!
PM MAIL WWW ICQ   Вверх
vadiml
Дата 23.3.2009, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 27.7.2007

Репутация: 5
Всего: 7



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

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


Это сообщение отредактировал(а) vadiml - 23.3.2009, 20:46
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0973 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.