Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.18;
Скачать: [xml.tar.bz2];




Вниз

Сборщик мусора 


Андре_   (2002-04-01 09:49) [0]

Есть ли в Delphi механизм, аналогичный сборщику мусора в Java ?
Извините, за столь наивный вопрос :-)

То есть, при выходе переменной типа объект(или его наследников) из области видимости этой самой переменной освобождается ли автоматически память отведенная под этот объект ?



panov   (2002-04-01 09:57) [1]

Сборщика нет.
Память под динамически созданные объекты нужно освобождать самому.



oomneeq   (2002-04-01 20:41) [2]

>То есть, при выходе переменной типа объект(или его наследников)
>из области видимости этой самой переменной освобождается ли >автоматически память отведенная под этот объект ?

При использовании интерфейсов все выглядит именно так.
Но для этого нужно переключать свои мозги с объектной модели на интерфейсную.
Интерфейсы хоть и заточены под COM, но их можно и так использовать, например, тем кто не любит за собой мусор убирать :)



Suntechnic   (2002-04-02 06:36) [3]

>oomneeq © (01.04.02 20:41)
Уважаемый, причём тут интерфейсы? Был конкретный вопрос, был конкретный ответ.



Slava   (2002-04-02 07:53) [4]

> Suntechnic ©

Вопрос: "То есть, при выходе переменной типа объект(или его наследников) из области видимости этой самой переменной освобождается ли автоматически память отведенная под этот объект ?"

Ответ: "При использовании интерфейсов все выглядит именно так.
Но для этого нужно переключать свои мозги с объектной модели на интерфейсную.
Интерфейсы хоть и заточены под COM, но их можно и так использовать, например, тем кто не любит за собой мусор убирать :)"

Вот при том и интерфейсы



Suntechnic   (2002-04-02 08:01) [5]

>Slava © (02.04.02 07:53)
"То ли лыжи не едут, то ли я....". Объясни мне причём тут интерфейсы(понятие во всех аспектах абстрактное) и я пойду повешусь....



MBo   (2002-04-02 08:41) [6]

Думаю, товарищи имели в виду следующее - при желании иметь автоматическую сборку мусора можно перестроить программу (обычно проще все с нуля написать ;) ) с использованием не ОБЪЕКТНЫХ ссылок, а ИНТЕРФЕЙСНЫХ.
При этом обеспечивается освобождение объекта, созданного по такой ссылке при уменьшении счетчика использований до 0 или выходе из зоны видимости.
пример
TIntObject=class(TSomeObject,ISomeInterface)
...объявление и реализация методов интерфейса

procedure TForm1.Button1Click(Sender: TObject);
var
Inter: ISomeInterface;
Obj:TIntObject;
begin
Obj:=TIntObject.Create;
Inter := TIntObject.Create;
....

end;
после выхода из процедуры Obj останется неосвобожденным, висячим,
а Inter освободится

Конечно, такой переход требует коренной перестройки всей программной концепции и применим лишь в некоторых случаях.
При аккуратном программировании, IMHO, нетрудно следить за корректным освобождением объектов, а с интерфейсными ссылками, насколько я понимаю, есть опасность, что объект может быть нежелательно уничтожен вследствие программных просчетов- так что панацеи нет :(



Slava   (2002-04-02 08:48) [7]

> Suntechnic ©

TInterfacedObject implements the IInterface (IUnknown) interface and can be used as a base for simple COM-compatible classes that benefit from having the IInterface methods implemented.
...
TInterfacedObject serves as a convenient base class for classes that implement interfaces because it implements the methods of IInterface. TInterfaceObject descendants use the IInterface reference-counting methods to handle lifetime management. That is, when the reference count on a TInterfaceObject descendant drops to zero, the object is automatically freed.

(c) Delphi Help ;o)



Slava   (2002-04-02 08:57) [8]

> MBo © (02.04.02 08:41)
Думаю, товарищи имели в виду следующее


Именно это.



Suntechnic   (2002-04-02 09:11) [9]

"Горе от ума"... Нет оно конечно можно и так, если подключить воображение, но к поставленному вопросу по-моему имеет только косвенное отношение. Хотя каждый сходит с ума по-своему. С++ в этом плане гораздо красивее с auto_ptr классом.



oomneeq   (2002-04-02 11:23) [10]

2 Slava, MBo
10x за разъясненья моей смутно выраженной мысли.

2 Suntechnic

>"Горе от ума"...
А кто горевал - то ? :-)
Обсуждаем усё - и прямое и косвенноё !



Fantasist   (2002-04-04 21:43) [11]

Кстати говоря есть как минимум два динамических объекта, которые делфи освобождает сам. Это строки и динамические массивы - для них организованна сборка мусора почти совсем как в Java.

А с интерфейсами - это, конечно, своеобразная сборка мусора. Она организуется на половину компилятором, на половину программно. Программно, так как все что делается - это вызывается _Release объекта, компилятором, така как он сам вызывает Release при обнулении переменной типа интерфейс, или при ее уничтожении. Надо сказать такой механизм не сказать чтобы меня очень радовал.




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.18;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.023 c
3-57597           Vertigo               2002-03-22 13:57  2002.04.18  
Проблема с IBQuery: подвисает приложение


3-57627           Voha Sh               2002-03-28 08:00  2002.04.18  
Link ORACLE - MS SQL через ODBC


7-57906           Sergo                 2002-01-21 11:14  2002.04.18  
Как можно создать из рисунков многостраничный PDF-документ???


4-57910           alex_ru               2002-02-14 16:31  2002.04.18  
Получение изображения свёрнутой программы


1-57770           Поклонение Отцам!     2002-04-05 20:36  2002.04.18  
помогите Ламеру Вопрос по TClipBoard :)