array of TFileStream
9 отговора
229 прегледа
array of TFileStream
Trqbva mi, za da otvorq i da rabotq s mnogo fileove ednovremenno. s array of TFileStream imah problemi i se opitah s TList ama oshte po golemi problemi stanaha...ujas napravo. Nqkoi edno primerche shte dade li kak da sazdam pravilno array of TFileStream i da go unishtoja sled tova? Moje i s TList.
Re: array of TFileStream
Що не пробваш с TObjectList, поне той ще ти free-ва паметта използвана от обектите TFileStream :-)
Problema e che ne se osvobojdava pametta
znachi problema vsashnost e takav. nali pravq si array of TFileStream, zapalvam si go ama posle neshte da se osvobodi tazi pamet! Kashmer!!! Eto kakvo pravq az
Var
Files: array[0..9] of TFileStream;
..............
Files[0] := TFileStream.Create(......);
{e ne tochno tova pravq ama neshto podobno}
..............
posle freevam pametta taka
For I := 0 to 9 do
Files.Free;
i posle tazi pamet ne se freeva. Checkvam taka Files[0] = nil e TRUE!!!
I programata gramva zashtoto posle pak se optivam da napravq TFileStream.Create.
Nqkakvi idei? Problema vashmost e che ne se osovobojdava pametta.
Var
Files: array[0..9] of TFileStream;
..............
Files[0] := TFileStream.Create(......);
{e ne tochno tova pravq ama neshto podobno}
..............
posle freevam pametta taka
For I := 0 to 9 do
Files.Free;
i posle tazi pamet ne se freeva. Checkvam taka Files[0] = nil e TRUE!!!
I programata gramva zashtoto posle pak se optivam da napravq TFileStream.Create.
Nqkakvi idei? Problema vashmost e che ne se osovobojdava pametta.
Re: Problema e che ne se osvobojdava pametta
> For I := 0 to 9 do
Files.Free;
ми се струва, че трябва да стане:
For I := 0 to 9 do
Files[I].Free;
тъй като Files ти е самия масив, а Files[I] е съответния TFileStream в него. Освен това не забравяй, че метода Free освобождава паметта, заделена за обекта, но не променя указателя на Nil - това е твоя грижа. Успех!
Mixy
Files.Free;
ми се струва, че трябва да стане:
For I := 0 to 9 do
Files[I].Free;
тъй като Files ти е самия масив, а Files[I] е съответния TFileStream в него. Освен това не забравяй, че метода Free освобождава паметта, заделена за обекта, но не променя указателя на Nil - това е твоя грижа. Успех!
Mixy
Редактирано от Mixy на
Re: Problema e che ne se osvobojdava pametta
daje triabva da se typecastva kum TObject t.e :
freeandnil(TObject (files))
freeandnil(TObject (files))
Re: Problema e che ne se osvobojdava pametta
aaaa obarkal sam go imah vpredvid Files.Free. Proto tuk sam go napisal greshno.
Re: Problema e che ne se osvobojdava pametta
Kakto ti kazaha po-gore , no sigurno ne si vidql sled files.free trqbva da napravi6 i files:=nil, ako 6te proverqva6 posle za nil. A nai dobre /sa6to go kazaha\/ :
for i := 0 to n-1 do
FreeAndNil(files); //dokolkoto si spomnqm nqma nujda ot typecast
A ako pita6 mene e nai-dobre /sa6to go pisaha/ da izpolzva6 TObjectList;
for i := 0 to n-1 do
FreeAndNil(files); //dokolkoto si spomnqm nqma nujda ot typecast
A ako pita6 mene e nai-dobre /sa6to go pisaha/ da izpolzva6 TObjectList;
Re: Problema e che ne se osvobojdava pametta
Предложение за TList реализация (с TList се работи доста по лесно и удобно, пък и можеш да го тъпчеш колкото ти душа иска
):
FileList : TList; //някъде си го създавай
procedure DoSomething;
var
FS : TFileStream;
begin
FS := TFileStream.Create(....);
.......
FileList.Add( FS );
end;
procedure Destroy;
begin
while FileList.Count > 0 do begin
TFileStream( FileList[ 0 ]).Free;
FileList.Delete( 0 );
end;
FileList.Free;
end;
Не всичко което виси е Windows, но той най-често го прави
FileList : TList; //някъде си го създавай
procedure DoSomething;
var
FS : TFileStream;
begin
FS := TFileStream.Create(....);
.......
FileList.Add( FS );
end;
procedure Destroy;
begin
while FileList.Count > 0 do begin
TFileStream( FileList[ 0 ]).Free;
FileList.Delete( 0 );
end;
FileList.Free;
end;
Не всичко което виси е Windows, но той най-често го прави
Gotovo
Blagodarq na vsichki, koito se pomachiha da mi pomognat.
Znachi kakto kazva mf2hd s TObjectList i posle FreeAndNil. Znachi za prav pat chuvam za FreeAndNil i vidqh v source vsashnost kakvo pravi - prisaedinqva nill i posle free-va obekta. Neshto, koeto az si misleh, che go pravi Free methoda (i po tochno Destroy). Neshto kakto vinagi imam nqkakvi propuski s takiva operacii s obekti i pointers.
No vse pak ne bi li trqbvalo da se nil-va obekta kato mu se osvobodi pametta!?
Znachi kakto kazva mf2hd s TObjectList i posle FreeAndNil. Znachi za prav pat chuvam za FreeAndNil i vidqh v source vsashnost kakvo pravi - prisaedinqva nill i posle free-va obekta. Neshto, koeto az si misleh, che go pravi Free methoda (i po tochno Destroy). Neshto kakto vinagi imam nqkakvi propuski s takiva operacii s obekti i pointers.
No vse pak ne bi li trqbvalo da se nil-va obekta kato mu se osvobodi pametta!?