![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Где лучше освобождать память?
AIRDIGER © (2009-04-21 05:49:00)Где лучше освобождать память?
в том месте где она уже стала ненужной или в конце кода в секциях винализации?
(сильно не пинайте я только собираюсь поступать в инстик мне 17л.)
Пример:
//...............................
Type TResType = MakeIntResource;
PLangs = ^TLangs;
TLangs = Array of WORD;
PGroupIconNameType = ^TGroupIconNameType;
TGroupIconNameType = packed record
Name : String;
ID : DWORD;
Lang : TLangs;
end;
PGroupNameItems = ^TGroupNameItems;
TGroupNameItems = Array of PGroupIconNameType;
PIconIndex = ^TIconIndex;
TIconIndex = Record
Lang : TLangs;//array of WORD;
end;
TIconCount = Array of TIconIndex;
//...................................
{--------------------------------- ResEnum ------------------------------------}
function ResEnum(hModule: THandle; ResType: PChar; ResName: PChar; Ptr: integer): boolean; stdcall;
var
Name : String;
PINT : PGroupIconNameType;
begin
New(PINT);
FillMemory(PINT,SizeOf(PINT^),0);
SetLength(PGroupNameItems(Ptr)^,Succ(Length(PGroupNameItems(Ptr)^)));
PGroupNameItems(Ptr)^[Pred(Length(PGroupNameItems(Ptr)^))] := PINT;
try
Name:= ResName;
PGroupNameItems(Ptr)^[Pred(Length(PGroupNameItems(Ptr)^))].Name:= Name;
EnumResourceLanguages(hModule,RT_GROUP_ICON,PChar(Name),@LangEnumProc,
Integer(@PGroupNameItems(Ptr)^[Pred(Length(PGroupNameItems(Ptr)^))].Lang));
except
PGroupNameItems(Ptr)^[Pred(Length(PGroupNameItems(Ptr)^))].ID := DWORD(ResName);
EnumResourceLanguages(hModule,RT_GROUP_ICON,PChar(DWORD(ResName)),@LangEnumProc,
Integer(@PLangs(PGroupNameItems(Ptr)^[Pred(Length(PGroupNameItems(Ptr)^))].Lang) ));
end;
Result := True;
end;
//..........................................
var
GNI: TGroupNameItems;
begin
try
//...какой то код.
// вызов функци где добавляется структура в массив
EnumResourceNames(hModule,RT_GROUP_ICON, @ResEnum, Integer(@GNI))
finally
так здесь по все логике нужно высвобождать память
end;
end;
это к коду
например был создал в функцие массив из указателей на структуры и в цикле его запонял добовляя в массив новую запись через New();
то ка нужно высвободить память? так же перебором вего массва
for i:= to Pred(Length(MyArray)) do begin
Dispose(MyArray[i]);
end;
или есть метод какой-нибудь высвобождающий всё сразу что было добавленно в массив?
Ega23 (2009-04-21 09:54:00) [21]
> Так оно тут и пременяется:
А нафига packed?
AIRDIGER (2009-04-21 08:16:00) [22]
> KSergey © (21.04.09 08:04) [3]
> Сроме статических массивов бывают ещ единамическиеlang:
> array of WORD ; Размер их легко менять по ходу пьессы, равно
> как и узнавать текущий размер. И не надо будет заботиться
> о том когда их освобождать - компилятор все сделает волшебно
> в нужное время.
Так оно тут и пременяется:
TGroupIconNameType = packed record
Name : String;
ID : DWORD;
Lang : TLangs; <------ оно же и есть = lang: array of WORD ;
end; Type TLangs = Array of WORD;
KSergey (2009-04-21 08:04:00) [23]Сроме статических массивов бывают ещ единамические
lang: array of WORD ;
Размер их легко менять по ходу пьессы, равно как и узнавать текущий размер. И не надо будет заботиться о том когда их освобождать - компилятор все сделает волшебно в нужное время.
AIRDIGER (2009-04-21 07:23:00) [24]
> MBo © (21.04.09 07:04) [1]
>
> PLangs = ^TLangs;
> TLangs = Array of WORD;
От них нелзя избавиться ... они мне не мешают...
ICON
ресурс-1
ланг
1024
1049
1033
pecурс-2
ланг
1024
1033
ресурс-3
ланг
1033
и увсех могут быть разное количесто языковых копий
если массив сделать статическим наприме lang: array [1..144] of WORD ; то не понятно будет сколько же найдено языковых копий у данного ресурса?
MBo (2009-04-21 07:04:00) [25]Типы указателей на динамический массив вроде этого:
PLangs = ^TLangs;
TLangs = Array of WORD;
нужны крайне редко.
Избавься от них, тогда будет попроще прочитать и понять, что у тебя в коде делается.