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

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

Где лучше освобождать память?


Страницы:   1 2

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;

нужны крайне редко.
Избавься от них, тогда будет попроще прочитать и понять, что у тебя в коде делается.


Страницы:   1 2

Наверх

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