Dispose mem
6 отговора
169 прегледа
Dispose mem
Извинявам се за сигурно елементарния въпрос но съм новобранец в Делфи.
Когато от една форма чрез натискане на бутон създавам нова форма и като неин собственик подавам параметъра self аз ли трябва да освободя паметта заета от новата форма или нейният собственик ще го направи?
С други думи кода по-долу правилен ли е?
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2 := TForm2.Create(self);
Form2.ShowModal();
if ModalResult = mrOk then
begin
...
end;
Form2.Free();
Form2 := nil;
end;
А ако на мястото на self поставя Application като собственик какво се получава тогава с освобождаването на паметта.Кой трябва да я освободи?
В случая self е формата от която чрез натискане на бутон създавам новата форма.Така ли е?
Когато от една форма чрез натискане на бутон създавам нова форма и като неин собственик подавам параметъра self аз ли трябва да освободя паметта заета от новата форма или нейният собственик ще го направи?
С други думи кода по-долу правилен ли е?
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2 := TForm2.Create(self);
Form2.ShowModal();
if ModalResult = mrOk then
begin
...
end;
Form2.Free();
Form2 := nil;
end;
А ако на мястото на self поставя Application като собственик какво се получава тогава с освобождаването на паметта.Кой трябва да я освободи?
В случая self е формата от която чрез натискане на бутон създавам новата форма.Така ли е?
Re: Dispose mem
Добра практика е да си я освобождаваш ти. Кодът ти не е съвсем коректен. Трябва да е нещо такова:
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2 := TForm2.Create(self);
try
if Form2.ShowModal = mrOk then
begin
...
end;
finally
Form2.Free;
Form2 := nil;
//или направо FreeAndNil(Form2);
end;
end;
Re: Dispose mem
Най - добре е да поставиш кода в блок try finally, за да се осигуриш от грешка.
Щом формата е модална няма смисъл от nil. Формите е по добре да се унищожават с Release.
With Form2.Create(Application) do
try
if ShowModal = mrOk then
begin
...
end;
finally
Release;
end;
end;
Щом формата е модална няма смисъл от nil. Формите е по добре да се унищожават с Release.
With Form2.Create(Application) do
try
if ShowModal = mrOk then
begin
...
end;
finally
Release;
end;
end;
Re: Dispose mem
Еми имайки впредвид кода който си дал няма голямо значение дали е Self или Application защото ти сам освобождаваш паметта с Form2.Free;
Разликата е се появява тогава когато формата не я освобождаваш ти.
Ако Owner e Application паметта заделена за формат ще се освободи когато затвориш апликацията.
Ако Owner е Self - ще се освободи когато се освободи Self-a.
Не всичко което виси е Windows, но той най-често го прави !!!
Разликата е се появява тогава когато формата не я освобождаваш ти.
Ако Owner e Application паметта заделена за формат ще се освободи когато затвориш апликацията.
Ако Owner е Self - ще се освободи когато се освободи Self-a.
Не всичко което виси е Windows, но той най-често го прави !!!
Re: Dispose mem
Защо try блока е след конструктора не трябва ли да е преди него.
Нали в конструктора се заделя паметта и ако не може да стане заделянето на памет трябва да се предизвика изключение.
Става въпрос за следното
Form2 := TForm2.Create(self)l
try
if Form2.ShowModal() = mrOk then
begin
...
end;
finally
а защо блока де не се постави
try
Form2 := TForm2.Create(self)l
if Form2.ShowModal() = mrOk then
begin
...
end;
finally
Нали в конструктора се заделя паметта и ако не може да стане заделянето на памет трябва да се предизвика изключение.
Става въпрос за следното
Form2 := TForm2.Create(self)l
try
if Form2.ShowModal() = mrOk then
begin
...
end;
finally
а защо блока де не се постави
try
Form2 := TForm2.Create(self)l
if Form2.ShowModal() = mrOk then
begin
...
end;
finally
Re: Dispose mem
Едно просто обеснение - ами ако имаш изключение при create-a няма какво да освобождаваш - т.е. dispose ;-)))) както го наричаш - free също ще гръмне - предполага се, че все пак в кода ти трябва да има "безгрешни" блокове - иначе всеки ред би трябвало да е заграден от try - между другото - това е конструкция която влияе върху бързодействието и размера на кода ?!? ;-))))
---
Колкото повече, толкова повече.
---
Колкото повече, толкова повече.
Re: Dispose mem
> Защо try блока е след конструктора не трябва ли да е преди него.
Не, защото Constructor Create е "Class method" и е направен по такъв начин, че сам прехваща изключенията в себеси и се само-освобождава.
Не, защото Constructor Create е "Class method" и е направен по такъв начин, че сам прехваща изключенията в себеси и се само-освобождава.