Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];

Вниз

nil   Найти похожие ветки 

 
ninja ©   (2004-11-16 16:34) [0]

Привет!
у меня есть дин. массив объектов. Если я сделаю так: mas[i]:=nil, удалится ли объект из памяти? или надо сначала делать mas[i].Free, а потом уже mas[i]:=nil??


 
Плохиш ©   (2004-11-16 16:38) [1]

Сначала free, потом nil.


 
begin...end ©   (2004-11-16 16:39) [2]


> ninja ©   (16.11.04 16:34)


> или надо сначала делать mas[i].Free, а потом уже mas[i]:=nil??

Или [1], или FreeAndNil(mas[i]).


 
Reindeer Moss Eater ©   (2004-11-16 16:40) [3]

На первомайской демонстрации, если выпустить из руки нитку, то шарик сразу взрывается, или просто улетает в небо?


 
ninja ©   (2004-11-16 16:51) [4]


> Reindeer Moss Eater ©   (16.11.04 16:40) [3]


На демонстрации первомайские не ходил, так что про шарики не знаю. Может, и сразу взрываются :) Я только начинаю разбираться с ООП. Много неочевидных вещей.


> begin...end ©   (16.11.04 16:39) [2]

у меня такого нету.


 
palva ©   (2004-11-16 17:49) [5]

> у меня такого нету.
Поищи в SysUtils (D7)


 
Плохиш ©   (2004-11-16 18:04) [6]


> palva ©   (16.11.04 17:49) [5]
> > у меня такого нету.
> Поищи в SysUtils (D7)

У него D4, о чём он, в отличии от большинства новичков :-(, сразу же сказал :-)


 
jack128 ©   (2004-11-16 18:05) [7]

AFAIK, FreeAndNIl только в пятой версии появился

procedure FreeAndNil(var Obj);
var
 P: TObject;
begin
 P := TObject(Obj);
 TObject(Obj) := nil;  // clear the reference before destroying the object
 P.Free;
end;


 
ninja ©   (2004-11-16 18:11) [8]


> jack128 ©   (16.11.04 18:05) [7]

Спасибо! функция прикольная.
хотя уже стрельнул D7, ставить буду.

PS: где можно почитать подробно про ООП (на русском желательно)? может даже книжки какие-нибудь порекомендуете?

спасибо.


 
panov ©   (2004-11-16 18:19) [9]

ninja ©   (16.11.04 16:51) [4]
В зависимости от того, что ты понимаешь под "объектом" есть разные ответы.

Если ты понимаешь под объектом экземпляр класса или объект как таковой(TObject), то нужно понимать, что при создании объекта ему выделяется память, причем сам объект может также динамически получать память для своих нужд(GetMem AllocMem и пр.).

При этом у всех объектов существует метод Destroy, в котором и описываются действия, в том числе и для освобождения памяти.

Создаются объекты методом Create. После выполнения метода Create программа получает ссылку на только что созданный объект. Именно эта ссылка и присваивается некторой переменной типа TObject.

Естественно, что в динамический массив ты помещаешь не сам объект, а лишь указатель - ссылку на него.
При выполнении оператора mas[i] := nil; ты присваиваешь указателю, который находится в этом элементе массива 0, теряя при этом ссылку на сам объект. Объект при этом не знает, что ты хочешь его уничтожить, и, естественно, возникает утечка памяти.

Т.е. для объекта всегда необходимо выполнять деструктор для уничтожения. Вызов деструкторы осуществляется методом Free.

т.е. в твоем случае необходимы 2 оператора:


mas[i].Free;
mas[i] := nil;


В случае же, если ты понимаешь под объектом, например, структуру(record), то здесь ситуация иная:

type

 TMyRec=record
    Str: String;
    Conter: Integer;
 end;

...
var
  arr: array of TMyRec;
...
SetLength(arr,1);


В этом случае память освобождать не нужно.

PS.
Общий метод для понимания:

Если у тебя в массиве(да и где угодно) находятся указатели на динамически выделенные участки памяти, то и уничтожать тебе их придется вручную.


 
Defunct ©   (2004-11-16 18:37) [10]

ninja ©   (16.11.04 16:51) [4]
> Я только начинаю разбираться с ООП. Много неочевидных вещей.

Знаете, а ведь вы это написали лишь только потому, что в Delphi есть исключение для динамических массивов.

A : Array of TSomeClass;

A := Nil; // освобождает память занятую под массив


A := Nil - глупое исключение, непонятно с какой целью его вообще сделали.

На самом деле, если отбросить эту глупость, то все получается однозначно:

освободить память:
FreeMem
Dispose

разрушить объект и очистить занятую им память:
любой деструктор или метод вызывающий деструктор
(Destroy, Free)

Освободить память занятую массивом:
SetLength( A, 0);

Соответственно ответ на ваш вопрос:

Для разрушения объекта и освобождения занятой им памяти используется любой Destructor объекта.

Для изменения памяти занятой под элементы массива используется SetLength.

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

Соответственно:
mas[i].Free - вызовет деструктор объекта, разрушит и освободит занятую объектом память.

mas[i]:=nil - присвоит i-му элемементу массива значение Nil. (при этом i-й элемент (ссылка на объект) так и будет занимать положенные ей 4 байта.

mas := nil - удалит освободит занятую память под все ссылки, (равносильно SetLength(mas, 0) ), но ни в кое случае не разрушит объекты.


 
Defunct ©   (2004-11-16 19:22) [11]

> При этом у всех объектов существует метод Destroy, в котором и описываются действия, в том числе и для освобождения памяти.

Не у всех. В общем случае надо сказать, что у объектов есть конструкторы и деструкторы. Первые выделяют память, последние освобождают.


 
panov ©   (2004-11-16 20:01) [12]

Defunct ©   (16.11.04 19:22) [11]

У указанных - у всех-)


 
Amoeba ©   (2004-11-17 10:29) [13]

Литературы в эл. виде полно здесь
http://www.podgoretsky.com/pascal.html



Страницы: 1 вся ветка

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

Наверх




Память: 0.48 MB
Время: 0.05 c
4-1098466459
Dot
2004-10-22 21:34
2004.12.05
изменить байт


14-1100708166
cyborg
2004-11-17 19:16
2004.12.05
Опрос по поводу данного форума


1-1100612069
ninja
2004-11-16 16:34
2004.12.05
nil


1-1100690198
ALEKCEY
2004-11-17 14:16
2004.12.05
Обработка математического выражиния


14-1100620668
вразлет
2004-11-16 18:57
2004.12.05
Как давно и при каких обстоятельствах Вы появились на ресурсе?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский