Форум: "Основная";
Текущий архив: 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.038 c