![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
New & Dispose [D5, Win95/98]
Dmitry Toropov © (2002-07-24 18:04:00)Если кому лень особенно напрягать не придется, прошу ответить на следующий вопрос:
использую след. код (схематично):
Pobj = ^Tobj;
Tobj = record
ph:TProgressBar;
s:string;
end;
Tlst =class( TList )
public
function Add(t:Pobj):integer;override;
destructor Destroy;
...
property Items[index:integer]:Pobj read GetIndex write PutIndex;
end;
в форме в OnCreate:
lst:=TList.Create;
добавляю в список:
...
var
p:Pobj;
begin
New(p);
p^.pb:=TProgressBar.Create(frmMain);
p^.pb.Parent:=frmMain;
lst.Add(p);
в OnDestroy формы:
lst.Free;
теперь, (кто дотерпел :))), собственно вопрос:
почему (теоретически объяснить) это работает:
destructor Destroy;
var
i:integer;
begin
for i:=0 to lst.Count-1 do begin
Dispose(Items[i]);
end;
end;
т.е., почему мне не надо делать
Items[i]^.pb.Free; //?
перед Dispose(Items[i]);
Anatoly Podgoretsky (2002-07-24 19:04:00) [21]Каждый созданный объект Createдолжен быть освобожден Free
Каждый выделенный блок памяти Newдолжен быть возвращен Dispose
Skier (2002-07-24 19:00:00) [22]>Dmitry Toropov
> Так прав я или не прав?
ТЫ НЕПРАВ !!!
Попробуй убери строку p^.pb:=TProgressBar.Create(frmMain);
и обратись к p^.pb как к объекту.
И сразу увидишь как "память отводится именно для record со всеми ее полями"
Пробуй...
Dmitry Toropov (2002-07-24 18:53:00) [23]из Help"а:
The New procedure creates a new dynamic variableand sets a pointer variable to point to it. P is a variable of any pointer type. The size of the allocated memory block corresponds to the size of the type that P points to. The newly created variable can be referenced as P^.
Поэтому, я думаю что динамическая память отводится именно для recordсо всеми ее полями ( string, TProgressBarи т.д.).
Так прав я или не прав?
Skier (2002-07-24 18:45:00) [24]>Dmitry Toropov
TProgressBar.Create создаёт экзепмляр класса в памяти.
> Получается, что когда я делаю New(p), я уже отвожу место
> на куче для p^.pb(progress bar"a).
Ничего подобного !
Ты отводишь место толькодля указателя
(p^.pb - 4 байта) на экземпляр класса, который ты ДОЛЖЕНсоздать через TProgressBar.Create.
Dmitry Toropov (2002-07-24 18:41:00) [25]То, что форма освободит - это ясно, но я динамически создаю потоки, которые взаимодействуют с progress bar"ами и их нужно бы удалять самостоятельно по мере прекращения соответствующих потоков.
Не очень понимаю, что делает TProgressBar.Create.
Получается, что когда я делаю New(p), я уже отвожу место на куче для p^.pb(progress bar"a).
В принципе, вопрос сводится именно к тому, что же делает Create.
Skier (2002-07-24 18:21:00) [26]>Dmitry Toropov
Вообще-то все твои ProgressBar-ы освободит форма при своём
уничножении (хотя всё это не есть хорошо).
> почему (теоретически объяснить) это работает:
>
> destructor Destroy;
> var
> i:integer;
> begin
> for i:=0 to lst.Count-1 do begin
> Dispose(Items[i]);
> end;
> end;
А почему (как тебе кажется) это не должно работать ?