Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

New & Dispose [D5, Win95/98]


Страницы:   1 2

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;


А почему (как тебе кажется) это не должно работать ?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо