время жизни
От: delphi_teapot  
Дата: 18.03.03 14:46
Оценка:
Многоуважаемые дельфи-гуру, помогите!
Страдаю второй год! Никак не пойму (все мои друзья-гуру не могут мне объяснить).
Слыхал от людей, что все объекты в обжект паскале динамические.
1. Когда объект (т.е. указатель) выходит за пределы видимости, то уничтожается ли объект? Или я обязан явно вызвать деструктор?
2. Cтало быть, все объекты в куче?
3. Если есть два динамических массива А и В, то A:=B; приводит к освобождению памяти, на которую до этого ссылался А?
Помогите!
Re: время жизни
От: Demiurg  
Дата: 18.03.03 15:02
Оценка: 3 (1)
Здравствуйте, delphi_teapot, Вы писали:

DT>Многоуважаемые дельфи-гуру, помогите!

DT>Страдаю второй год! Никак не пойму (все мои друзья-гуру не могут мне объяснить).
DT>Слыхал от людей, что все объекты в обжект паскале динамические.
DT>1. Когда объект (т.е. указатель) выходит за пределы видимости, то уничтожается ли объект? Или я обязан явно вызвать деструктор?
DT>2. Cтало быть, все объекты в куче?
DT>3. Если есть два динамических массива А и В, то A:=B; приводит к освобождению памяти, на которую до этого ссылался А?
DT>Помогите!

Здесь нет ничего сложного. Если ты создал объект (вызвав его конструктор), то ты обязан его уничтожить. Простое объявление переменной объекта приводит просто к выделению памяти под указатель, область памяти, где будет храниться адрес настоящего объекта. При выходе из области видимости объекты не уничтожаются, уничтожаются толко динамические массивы, строки и объекты, представленные как интерфейсы.
То есть если ты вызвал конструктор, но потом забыл вызвать деструктор, объект будет существовать в течении всего времени жизни программы.
Присвоение A := B просто приводит к копированию значения адреса объекта, то две переменные теперь указывают на один объект, естественно, что ничего не освобождаются. Если потом вызвать A.Free, то вызывать B.Free будет нельзя, ибо объект уже уничтожен... Ну и так далее...
Re[2]: время жизни
От: delphi_teapot  
Дата: 18.03.03 15:06
Оценка:
Из твоего знатного ответа я только одного не понял, как быть с A:=B; т.е. я предварительно должен освободить память А?
Re[3]: время жизни
От: Demiurg  
Дата: 18.03.03 15:18
Оценка:
Здравствуйте, delphi_teapot, Вы писали:

DT>Из твоего знатного ответа я только одного не понял, как быть с A:=B; т.е. я предварительно должен освободить память А?


А, ты имеешь ввиду, что A уже указывает на какой-то объект? В таком случае, если ты так сделаешь, то просто потеряешь в памяти этот объект и, соответсвенно, не сможешь его удалить более. Так что да, объект A нужно освободить вручную, если он уже не нужен, ну или в каку-нить временную переменную скопировать (адрес, а не объект), если еще нужен.
Re[2]: время жизни
От: delphi_kettle  
Дата: 18.03.03 15:22
Оценка:
Здравствуйте, Demiurg,

Прочитал я это сообщение и подумал как же нам, дельфистам, повезло с языком! Так удобно и надежно все придумано!
Re[4]: время жизни
От: s.ts  
Дата: 18.03.03 15:25
Оценка:
Здравствуйте, Demiurg, Вы писали:

D>Здравствуйте, delphi_teapot, Вы писали:


DT>>Из твоего знатного ответа я только одного не понял, как быть с A:=B; т.е. я предварительно должен освободить память А?


D> А, ты имеешь ввиду, что A уже указывает на какой-то объект? В таком случае, если ты так сделаешь, то просто потеряешь в памяти этот объект и, соответсвенно, не сможешь его удалить более. Так что да, объект A нужно освободить вручную, если он уже не нужен, ну или в каку-нить временную переменную скопировать (адрес, а не объект), если еще нужен.


Ну... это если в классе не реализован подсчет ссылок...
Если же реализован (см. про интерфейсы), то при присваивании А:=... уменьщается число ссылок на объект, на который указывал A и, если оно (число ссылок) =0, то Free вызывается автоматически...
Re[3]: время жизни
От: s.ts  
Дата: 18.03.03 15:26
Оценка:
Здравствуйте, delphi_kettle, Вы писали:

DK>Здравствуйте, Demiurg,


DK>Прочитал я это сообщение и подумал как же нам, дельфистам, повезло с языком! Так удобно и надежно все придумано!


Что именно-то ?
Re[3]: время жизни
От: Demiurg  
Дата: 18.03.03 15:28
Оценка:
Здравствуйте, delphi_kettle, Вы писали:


DK>Прочитал я это сообщение и подумал как же нам, дельфистам, повезло с языком! Так удобно и надежно все придумано!


Хммм... Мне тоже нравится ссылочная модель, реализованная в Дельфи, но в С++ ООП мне все же нравится больше
Re[5]: время жизни
От: Demiurg  
Дата: 18.03.03 15:34
Оценка:
Здравствуйте, s.ts, Вы писали:

ST>Ну... это если в классе не реализован подсчет ссылок...

ST>Если же реализован (см. про интерфейсы), то при присваивании А:=... уменьщается число ссылок на объект, на который указывал A и, если оно (число ссылок) =0, то Free вызывается автоматически...

Конечно, про интерфейсы понятно, где-то выше писал...Любой класс можно унаследовать от чисто абстрактного класса с помощью слова Interface, а не Class, тогда и будет работать подсчет ссылок, освобождение при выходе из области видимости, короче все прелести Однако есть и неудобства по сравнению с обычными классами...
Re[4]: время жизни
От: delphi_kettle  
Дата: 18.03.03 15:44
Оценка:
Здравствуйте, s.ts, Вы писали:

DK>>Прочитал я это сообщение и подумал как же нам, дельфистам, повезло с языком! Так удобно и надежно все придумано!


ST>Что именно-то ?


То что при выходе из области действия ничего не уничтожается автоматически. Не то что в этом запутанном си++. Правда мои друзья, использующие си++, меня дураком называют, все твердят про какие-то утечки. Какая разница?! Дельфи == язык чайников!
Re[6]: время жизни
От: s.ts  
Дата: 18.03.03 15:45
Оценка: 3 (1)
Здравствуйте, Demiurg, Вы писали:

D>Здравствуйте, s.ts, Вы писали:


ST>>Ну... это если в классе не реализован подсчет ссылок...

ST>>Если же реализован (см. про интерфейсы), то при присваивании А:=... уменьщается число ссылок на объект, на который указывал A и, если оно (число ссылок) =0, то Free вызывается автоматически...

D> Конечно, про интерфейсы понятно, где-то выше писал...Любой класс можно унаследовать от чисто абстрактного класса с помощью слова Interface, а не Class, тогда и будет работать подсчет ссылок, освобождение при выходе из области видимости, короче все прелести Однако есть и неудобства по сравнению с обычными классами...


Я бы сказал иначе: любой класс может реализовывать интерфейсы. Наследовать можно от класса и интерфейса — это замена множественному наследованию, используемая в "новых" языках типа delphi, java etc.
А подсчет ссылок можно реализовать просто напросто унаследовав от TInterfacedObject — тут, наверное, не нужно даже и про интерфейсы ничего знать.
Re[4]: время жизни
От: s.ts  
Дата: 18.03.03 15:48
Оценка: 33 (1)
Здравствуйте, Demiurg, Вы писали:

D>Здравствуйте, delphi_kettle, Вы писали:


D>

DK>>Прочитал я это сообщение и подумал как же нам, дельфистам, повезло с языком! Так удобно и надежно все придумано!

D> Хммм... Мне тоже нравится ссылочная модель, реализованная в Дельфи, но в С++ ООП мне все же нравится больше


Поддерживаю двумя руками
Тем более, что "ссылочная модель", фактически по возмозможностям является подмножеством множественного наследования + переопределение операторов (С++), но реализована на уровне компилятора.
Re[5]: время жизни
От: s.ts  
Дата: 18.03.03 15:58
Оценка:
Здравствуйте, delphi_kettle, Вы писали:

DK>Здравствуйте, s.ts, Вы писали:


DK>>>Прочитал я это сообщение и подумал как же нам, дельфистам, повезло с языком! Так удобно и надежно все придумано!


ST>>Что именно-то ?


DK>То что при выходе из области действия ничего не уничтожается автоматически. Не то что в этом запутанном си++. Правда мои друзья, использующие си++, меня дураком называют, все твердят про какие-то утечки. Какая разница?!


Ну, обзываться не стоит... Все дело вкусов. Но delphi отражает общую тенденцию в развитии языков программирования. Из распространенных языков только c++, наверное, и поддерживает множественное наследование. Но если использовать Borland С++, то есть выбор — там и ANSI поддерживается и интерфейсы.

DK> Дельфи == язык чайников!


Дык и на CBuilder можно программы мышкой рисовать в одном OnClik-е 8)
Просто с него (c delphi) многие начинают — отсюда и расхожее мнение. Мне тот-же C++ не кажется более сложным. Сложными могут быть кривые С++ библиотеки, основанные на макросах (кто знает-поймет).
Re: время жизни
От: Slicer [Wirkwood] Россия https://ru.linkedin.com/in/maksim-gumerov-039a701b
Дата: 18.03.03 15:59
Оценка: 11 (1)
DT>3. Если есть два динамических массива А и В, то A:=B; приводит к освобождению памяти, на которую до этого ссылался А?

В динамических массивах, насколько мне известно, реализован подсчет ссылок (как и в длинных строках). Так что никаких потерь памяти при этом не будет.

Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Re[5]: время жизни
От: Demiurg  
Дата: 18.03.03 16:26
Оценка:
Здравствуйте, delphi_kettle, Вы писали:

DK> Дельфи == язык чайников!


Так говорят те, кто плохо знает Дельфи
Re[5]: время жизни
От: Владик Россия  
Дата: 19.03.03 07:08
Оценка: 15 (1)
Здравствуйте, delphi_kettle, Вы писали:

ST>>Что именно-то ?

DK>То что при выходе из области действия ничего не уничтожается автоматически. Не то что в этом запутанном си++.

Я сначала подумал, что ты так иронизируешь. Но ты, похоже, серьезно Прелесть автоматического уничтожения объектов проще всего можно постичь ковырясь в VCL и наблюдая повсюду уродские try/finally.

DK>Правда мои друзья, использующие си++, меня дураком называют, все твердят про какие-то утечки. Какая разница?! Дельфи == язык чайников!


Пусть твои друзья называют дураками тех, кто придумал саму дельфю, точнее ее язык. Потому как отсутствие автоматического уничтожения объектов, наряду с отстутствием какой-либо системы сборки мусора, для современного прикладного языка высокого уровня — просто несерьезно. И чайникам этот язык противопоказан прежде всего, пока они не поймут что такое "утечки". Хотя если дельфя плавно перейдет в Delphi.NET, то все не так грустно. Но это будет уже другой язык, пусть и с такими же begin/end.

P.S. Готов принять кучу нулей от поклонников дельфей Желательно аргументированные (и, наверное, в другом форуме)
Как все запущенно...
Re[6]: время жизни
От: mrhru Россия  
Дата: 19.03.03 07:14
Оценка:
Здравствуйте, Владик, Вы писали:

[эмоции skipped]

В>... Потому как отсутствие автоматического уничтожения объектов, наряду с отстутствием какой-либо системы сборки мусора, для современного прикладного языка высокого уровня — просто несерьезно.


А в С++ существует какая-либо встроенная система уборки мусора для объектов создаваемых в куче?
Евгений
Re[5]: время жизни
От: Владик Россия  
Дата: 19.03.03 07:16
Оценка:
Здравствуйте, s.ts, Вы писали:

ST>Поддерживаю двумя руками

ST>Тем более, что "ссылочная модель", фактически по возмозможностям является подмножеством множественного наследования + переопределение операторов (С++), но реализована на уровне компилятора.

Не понял. Что реализовано на уровне компилятора? И какое отношение ссылочная модель имеет к переопределению операторов?
Как все запущенно...
Re[7]: время жизни
От: Владик Россия  
Дата: 19.03.03 07:25
Оценка:
Здравствуйте, mrhru, Вы писали:

В>>... Потому как отсутствие автоматического уничтожения объектов, наряду с отстутствием какой-либо системы сборки мусора, для современного прикладного языка высокого уровня — просто несерьезно.

M>А в С++ существует какая-либо встроенная система уборки мусора для объектов создаваемых в куче?

В С++ существует автоматическое уничтожение объектов. Встроенная система уборки мусора есть, например, в джаве. То и другое (с ограничениями) есть в C#. Нету ни того ни другого в С (без плюсов), в этом плане он очень похож на дельфю Но он при этом и на язык высокого уровня особо не претендует, скорее это "переносимый ассемблер".
Как все запущенно...
Re[8]: время жизни
От: mrhru Россия  
Дата: 19.03.03 07:39
Оценка: 36 (1)
Здравствуйте, Владик, Вы писали:

В>Здравствуйте, mrhru, Вы писали:


В>>>... Потому как отсутствие автоматического уничтожения объектов, наряду с отстутствием какой-либо системы сборки мусора, для современного прикладного языка высокого уровня — просто несерьезно.

M>>А в С++ существует какая-либо встроенная система уборки мусора для объектов создаваемых в куче?

В>В С++ существует автоматическое уничтожение объектов.


Не совсем правильно. Для объектов в стеке, а не в куче.

В>Встроенная система уборки мусора есть, например, в джаве. То и другое (с ограничениями) есть в C#. Нету ни того ни другого в С...


Тоже неправильно. Объекты в стеке самоликвидируются.

В> (без плюсов), в этом плане он очень похож на дельфю


И это неправильно.

В> Но он при этом и на язык высокого уровня особо не претендует, скорее это "переносимый ассемблер".


Опять неправильно. С всегда относится к языкам высокого уровня.

А с остальным — согласен.
Евгений
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.