Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.156] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 161 162 [163] 164 165 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#2431
,
|
|
|
|
дык и зачем GC его удалять? охота заиметь указатель в никуда? |
|
Сообщ.
#2432
,
|
|
|
|
Цитата korvin @ дык и зачем GC его удалять? охота заиметь указатель в никуда? Так в этом и состоит задача weak_ref GC удалит объект, а указатель в никуда ты не заимеешь |
|
Сообщ.
#2433
,
|
|
|
|
Цитата D_KEY @ Так в этом и состоит задача weak_ref GC удалит объект, а указатель в никуда ты не заимеешь ![]() если объект удалиться -- заимеешь. рантайм-указатель вникуда. Добавлено но в случае с GC объект не удалится, т.к. есть ссылка -- из weak_ptr на объект Добавлено ну или откуда там, из списка |
|
Сообщ.
#2434
,
|
|
|
|
Цитата korvin @ Цитата D_KEY @ Так в этом и состоит задача weak_ref GC удалит объект, а указатель в никуда ты не заимеешь ![]() если объект удалиться -- заимеешь. рантайм-указатель вникуда. Прочти еще раз хотя бы статью в википедии Ты заводишь слабую ссылку у которой(когда тебе нужно, например, при посылке "события") запрашиваешь жесткую ссылку на объект. Если объект уже удален, тебе придет null, если нет - то жесткая ссылка на объект. Какие указатели в никуда? Добавлено Цитата korvin @ но в случае с GC объект не удалится, т.к. есть ссылка -- из weak_ptr на объект weak_ref не хранит ссылку и weak_ref не учитывается сборщиком мусора(то есть он спокойно удаляет объект, если на него нет жестких ссылок). |
|
Сообщ.
#2435
,
|
|
|
|
не, я понял:
![]() ![]() (define weak-object (box (make-object))) (define some-list (list weak-object)) (send (box-ref (first some-list)) get-x) ; => x (box-set! weak-object #f) (send (box-ref (first some-list)) get-x) ; => error но зачем это? Добавлено Цитата D_KEY @ Прочти еще раз хотя бы статью в википедии ![]() прочти еще раз, что такое GC =) объекты живут до тех пор, пока на них есть хоть какая-то ссылка, в языках с GC нет weak_ptr в принципе, их можно реализовать как я показал выше, но не более, ты _не можешь_ создать weak_ptr Добавлено Цитата korvin @ объекты живут до тех пор, пока на них есть хоть какая-то ссылка точнее пока до них есть доступ |
|
Сообщ.
#2436
,
|
|
|
|
Цитата korvin @ А GC это такой волшебник, которое ну просто ЗНАЕТ, где лежит объект, есть ли ссылки на него и когда можно удалить объект? рочти еще раз, что такое GC =) объекты живут до тех пор, пока на них есть хоть какая-то ссылка, в языках с GC нет weak_ptr в принципе, их можно реализовать как я показал выше, но не более, ты _не можешь_ создать weak_ptr |
|
Сообщ.
#2437
,
|
|
|
|
Цитата Adil @ А GC это такой волшебник, которое ну просто ЗНАЕТ, где лежит объект, есть ли ссылки на него и когда можно удалить объект? эм... не волшебник, но да, знает. в этом его суть как бэ... |
|
Сообщ.
#2438
,
|
|
|
|
Во. Нарыл такой код.
![]() ![]() procedure DoSomething(const AProc: TProcedure); var X: Integer; begin for X := 1 to 3 do AProc; end; function Test: Integer; var N: Integer; procedure UseLocalVar; begin Inc(N); end; begin N := 0; DoSomething(@UseLocalVar); Result := N; end; procedure TForm1.Button1Click(Sender: TObject); begin Caption := IntToStr(Test); // ожидается: 3; реальный результат: access violation end; |
|
Сообщ.
#2439
,
|
|
|
|
Цитата korvin @ Цитата D_KEY @ Прочти еще раз хотя бы статью в википедии ![]() прочти еще раз, что такое GC =) Спасибо, я знаю. Приходилось даже реализовывать два алгоритма(простой с ячейкама фиксированного размера и посложнее с произвольным)... Цитата объекты живут до тех пор, пока на них есть хоть какая-то ссылка, в языках с GC нет weak_ptr в принципе Даже в статье в википедии есть пример на яве и луа. Цитата их можно реализовать как я показал выше, но не более, ты _не можешь_ создать weak_ptr Ты не можешь их реализовать, если их нет в языке с GC. Именно поэтому такие языки предоставляют специальные средства для этого. |
|
Сообщ.
#2440
,
|
|
|
|
Цитата Qraizer @ Во. Нарыл такой код. ![]() ![]() procedure DoSomething(const AProc: TProcedure); var X: Integer; begin for X := 1 to 3 do AProc; end; function Test: Integer; var N: Integer; procedure UseLocalVar; begin Inc(N); end; begin N := 0; DoSomething(@UseLocalVar); Result := N; end; procedure TForm1.Button1Click(Sender: TObject); begin Caption := IntToStr(Test); // ожидается: 3; реальный результат: access violation end; кстати согласен, какое-то неочевидное поведение, три раза пытался мысленно прогнать код, получал 3, а не AV Добавлено Цитата D_KEY @ Спасибо, я знаю. Приходилось даже реализовывать два алгоритма(простой с ячейкама фиксированного размера и посложнее с произвольным)... это который из этих: http://ulizko.com/posts/44/ ? Добавлено Цитата D_KEY @ Именно поэтому такие языки предоставляют специальные средства для этого. реквестирую пример, нет такого в Схеме/КЛ/Хаскелле Добавлено Цитата D_KEY @ Ты не можешь их реализовать, если их нет в языке с GC. и таки могу, привел пример. могу и как часть языка макрами сделать Добавлено Цитата D_KEY @ Даже в статье в википедии есть пример на яве и луа. а, вроде натыкался на обсуждение исключения нулевого указателя в яве? ну на то она и ява, но не думал, что в луа это тоже возможно... |
|
Сообщ.
#2441
,
|
|
|
|
Цитата Qraizer @ Турбо-Паскаль, кстати, такое в принципе не компилирует, ибоЕсли и это правда, то объясните с точки зрения документации, бо я что-то не припомню подобных ограничений у Turbo Pascal. Цитата . Кроме того, в качестве процедурных значений не могут указываться стандартные процедуры и функции, вложенные процедуры и функции, ... |
|
Сообщ.
#2442
,
|
|
|
|
Цитата korvin @ Цитата D_KEY @ Спасибо, я знаю. Приходилось даже реализовывать два алгоритма(простой с ячейкама фиксированного размера и посложнее с произвольным)... это который из этих: http://ulizko.com/posts/44/ ? Отвечу не сегодня. Скорее всего, никакой из конкретных. Механизм требовался не очень крутой и не для прикладной системы. Так что были особенности. Цитата А я и спрашиваю, что делать в этих языках, если нужны слабые ссылки.Цитата D_KEY @ Именно поэтому такие языки предоставляют специальные средства для этого. реквестирую пример, нет такого в Схеме/КЛ/Хаскелле Цитата Цитата D_KEY @ Ты не можешь их реализовать, если их нет в языке с GC. и таки могу, привел пример. могу и как часть языка макрами сделать Насколько я вижу, ты не понял, что нужно... Цитата Цитата D_KEY @ Даже в статье в википедии есть пример на яве и луа. а, вроде натыкался на обсуждение исключения нулевого указателя в яве? ну на то она и ява, но не думал, что в луа это тоже возможно... Какие еще исключения нулевого указателя? Ты код не смотрел что ли? ![]() ![]() import java.lang.ref.WeakReference; public class ReferenceTest { public static void main(String[] args) throws InterruptedException { Student s1 = new Student(1); System.out.println(s1); WeakReference<Student> ws = new WeakReference<Student>(s1); System.out.println(ws.get()); s1 = null; System.gc(); Thread.sleep(1000); System.out.println(ws.get()); } } class Student { public Student(int id) { this.id = id; } int id; public String toString() { return "[id=" + id + "]"; } } Создаем объект класса Student ![]() ![]() Student s1 = new Student(1); Затем создаем объект слабой ссылки ![]() ![]() WeakReference<Student> ws = new WeakReference<Student>(s1); Теперь ws "ссылается" на тот же объект, что и s1, но сборка мусора не учитывает эту ссылку на объект. А потом мы берем, и делаем так, чтобы на объект, на который ссылался s1, нет больше ссылок(для этого достаточно сделать так, чтобы на него не ссылался s1): ![]() ![]() s1 = null; Далее принудительно инициируем сборку мусора. После чего объект s1 будет удален, а при попытке получить ссылку от ws получим null. Для получения "жесткой" ссылки от мягкой вызывается метод get. Теперь ясно? |
|
Сообщ.
#2443
,
|
|
|
|
Цитата D_KEY @ А я и спрашиваю, что делать в этих языках, если нужны слабые ссылки. а я и показал, что делать. Цитата D_KEY @ Насколько я вижу, ты не понял, что нужно... понял, только это не нужно Цитата D_KEY @ Ты код не смотрел что ли? ![]() ![]() import java.lang.ref.WeakReference; public class ReferenceTest { public static void main(String[] args) throws InterruptedException { Student s1 = new Student(1); System.out.println(s1); WeakReference<Student> ws = new WeakReference<Student>(s1); System.out.println(ws.get()); s1 = null; System.gc(); Thread.sleep(1000); System.out.println(ws.get()); } } class Student { public Student(int id) { this.id = id; } int id; public String toString() { return "[id=" + id + "]"; } } Создаем объект класса Student ![]() ![]() Student s1 = new Student(1); Затем создаем объект слабой ссылки ![]() ![]() WeakReference<Student> ws = new WeakReference<Student>(s1); Теперь ws "ссылается" на тот же объект, что и s1, но сборка мусора не учитывает эту ссылку на объект. А потом мы берем, и делаем так, чтобы на объект, на который ссылался s1, нет больше ссылок(для этого достаточно сделать так, чтобы на него не ссылался s1): ![]() ![]() s1 = null; Далее принудительно инициируем сборку мусора. После чего объект s1 будет удален, а при попытке получить ссылку от ws получим null. Для получения "жесткой" ссылки от мягкой вызывается метод get. Теперь ясно? мне и до этого было ясно, не ясно только, почему тебе не ясно, что мне ясно =) и это таки не нужно |
|
Сообщ.
#2444
,
|
|
|
|
Цитата korvin @ и это таки не нужно В системах со сборкой мусора нет другого способа ссылаться на объект, не являясь одним из его владельцев. Пример я уже приводил - список подписчиков. Если бы это было не нужно - это бы и не появилось в языках со сборкой мусора(а появилось это в них не сразу).Кстати, можешь в общих чертах рассказать о том решении, которое ты привел? Добавлено Цитата korvin @ мне и до этого было ясно, не ясно только, почему тебе не ясно, что мне ясно =) Потому, что ты упорно утверждал, что этого нет в языках со сборкой мусора. Хотя эта концепция именно в них и появилась(кстати, она освещена в некоторых книгах по языкам программирования и компиляторам, в частности в "книге дракона", если мне память не изменяет). |
|
Сообщ.
#2445
,
|
|
|
|
Цитата D_KEY @ В системах со сборкой мусора нет другого способа ссылаться на объект, не являясь одним из его владельцев. Пример я уже приводил - список подписчиков.а в системах с GC так и не пишут, чтобы возникала необходимость в мягких ссылках, а многие даже и подумать не могут, что такое вообще есть и зачем-то даже кому-то нужно. и "владельцев" нет. а список подписчиков делается и без этого. Цитата D_KEY @ Если бы это было не нужно - это бы и не появилось в языках со сборкой мусора(а появилось это в них не сразу). давай ты перечислишь языки с GC, где есть мягкие ссылки, а я -- где нет? Цитата D_KEY @ Кстати, можешь в общих чертах рассказать о том решении, которое ты привел? то лишь набросок, если нужно полноценное решение, могу написать. Цитата D_KEY @ Потому, что ты упорно утверждал, что этого нет в языках со сборкой мусора. дык этого и нет ни в одном ЯП с GC, что я знаю (ну кроме джавы и возможно C#). языки с отключаемым GC (типа как в D, если не ошибаюсь) не считаются. Цитата D_KEY @ Хотя эта концепция именно в них и появилась в каких именно? в Яве что ли? =)) Добавлено Цитата korvin @ дык этого и нет ни в одном ЯП с GC, что я знаю (ну кроме джавы и возможно C#). вру, в Racket есть Добавлено вот, кстати на StackOverflow прочитал более понятный пример, но вопрос: если нужен plist в объектах, почему бы сразу не спроектировать класс с таким свойством? а в случае наличия множественного наследования или примесей это вообще не проблема |