![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
mastercz |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 5.11.2008 Репутация: нет Всего: нет |
Вот я тут задумался, и понял что непонимаю.
Какая принципиальная разница между двумя назначениями:
И еще в дополнение к вопросу: Может ли другая переменная занять область памяти, если переменная ее занимавшая уже не существует а жесткая ссылка на нее еще существует. Пример:
Это сообщение отредактировал(а) mastercz - 20.3.2009, 09:22 |
||||
|
|||||
SkoobyDoo |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 4.10.2007 Репутация: нет Всего: нет |
Первая запись, это типичная запись хэша, когда элементу присваивается значение. Во втором же случае, присваивается значение элементу анонимного хэша, то есть в переменной $hash хранится ссылка на анонимный хэш. Добавлено @ 09:38
Выполните скрипт и вам станет ясно ![]() Это сообщение отредактировал(а) SkoobyDoo - 20.3.2009, 09:58 |
||||
|
|||||
mastercz |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 5.11.2008 Репутация: нет Всего: нет |
SkoobyDoo, я наверно не точно задал ворос.
Вопрос следующий, если я получаю (неважно как, не важно откуда, допустим из тогоже XML:Simple) анонимный хэшь, или создаю его сам. То, ячейки памяти анонимного хэша защищенны от их захвата (изменения) какой либо другой переменной или нет. Возможна ли ситуация, когда вновь обьявленная переменная займет ту - же память, что и анонимный массив? P.S. пример, выше, я специально привел, чтобы показать, что переменная уже не существует а в ячейке памяти храниться ее значение. И поидеи эта память свободна ... или ... если к этой области памяти привязанна жесткая ссылка, то это приравниваеться к зарезервированной области памяти ? |
|||
|
||||
NuINu |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 131 Регистрация: 19.7.2008 Репутация: 5 Всего: 6 |
нет это не верно, память не свободна до тех пор пока существует хотябы одна ссылка на нее. и собственно не понятно, чего это вас так волнует свбодность памяти? что значит защищены? что значит захват? вы чего собственно добиваетесь? |
|||
|
||||
SkoobyDoo |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
tolkien |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 277 Регистрация: 5.4.2008 Репутация: 4 Всего: 4 |
Если на ячейку памяти нет ни одной ссылки. То Perl освобождает данную память. Покрайней мере мы должны думать что он ее освободит. На самом деле он может ее освободить или не освободить. Это как его создатели запрограммировали. В целях каких нибудь оптимизацией, например в целях быстродействия. Могут память не освобождать, а использовать ее повторно. |
|||
|
||||
vadiml |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 27.7.2007 Репутация: 5 Всего: 7 |
> $hash{a}='Вася';
> $hash->{a}='Вася'; В реальности переменная перла -- это С структура. Если отбросить адрес расположения строки 'Вася', то первый хеш от второго отличается только 1 флагом в этой структуре, т.е. для Вас -- разница в написании, для самого перла -- практически ни какой. Только вот Вам главное при передаче в функцию/из функции этого хеша не забывать в каком случае Вы передадите указатель на хеш, а в каком его содержимое. |
|||
|
||||
mastercz |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 5.11.2008 Репутация: нет Всего: нет |
Спасибо всем за помощь. Узнал для себя много нового.
В частности любопытная информация по утечки памяти. Хотя я видимо чего-то не допонимаю в частности почему в случае :
Память не освобождаеться, а в случае
она освобождаеться. Так-же заставил задуматься код из примера статьи предложенной SkoobyDoo, почему тут не возникает утечки памяти, если я обнуляю сылку в копии массива:
Это сообщение отредактировал(а) mastercz - 23.3.2009, 04:18 |
||||||
|
|||||||
GoDleSS |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 105 Регистрация: 11.2.2007 Где: Пироговский Репутация: 2 Всего: 2 |
Ничего любопытного: 1. Закольцеванный ссылки (кросс-линк). 2. Ссылки, которые далее не используются. Сборщик мусора, реализованный в перле, не умеет бороться с кросс-линками по прострой причине - он работает именно с ссылками, которые далее не пользуются в программе, а в случае с кросс-линками получается, что они ссылаются друг на друга и "в лоб" невозможно определить их дальнейшее "бесполезность". Это сообщение отредактировал(а) GoDleSS - 23.3.2009, 11:40 --------------------
It's a nice day to die my friend! |
||||||
|
|||||||
vadiml |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |