Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.06.07;
Скачать: CL | DM;

Вниз

Где лучше освобождать память?   Найти похожие ветки 

 
AIRDIGER ©   (2009-04-21 05:49) [0]

Где лучше освобождать память?
в том месте где она уже стала ненужной или в конце кода в секциях винализации?

(сильно не пинайте я только собираюсь поступать в инстик мне 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;

или есть метод какой-нибудь высвобождающий всё сразу что было добавленно в массив?


 
MBo ©   (2009-04-21 07:04) [1]

Типы указателей на динамический массив вроде этого:
PLangs = ^TLangs;
TLangs = Array of WORD;

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


 
AIRDIGER ©   (2009-04-21 07:23) [2]


> 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 ;    то не понятно будет сколько же найдено языковых копий у данного ресурса?


 
KSergey ©   (2009-04-21 08:04) [3]

Сроме статических массивов бывают ещ единамические

lang: array of WORD ;

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


 
AIRDIGER ©   (2009-04-21 08:16) [4]


> 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;


 
Ega23 ©   (2009-04-21 09:54) [5]


> Так оно тут и пременяется:


А нафига packed?


 
brother ©   (2009-04-21 10:00) [6]

> А нафига packed?

экономит?)


 
Сергей М. ©   (2009-04-21 10:05) [7]


> TGroupNameItems = Array of PGroupIconNameType;


Почему не Array of TGroupIconNameType ?
Сам себе создаешь трудности для их последующего героического преодоления ?)


 
KSergey ©   (2009-04-21 12:12) [8]

ТопикСтартеру: по ответам видно, что про вопрос в заголовке людям как бы и есть что сказать, но в коде ничерта не понятно, выискивать в нем быги никому не охота.
И беда именно в неудачной организации работы с данными: то дин. массивы, то какие-то указатели, все это перекручено/перенавернуто.

Надо быть проще :)


 
Игорь Шевченко ©   (2009-04-21 12:50) [9]


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


винда сама освободит


 
Anatoly Podgoretsky ©   (2009-04-21 13:10) [10]

> Игорь Шевченко  (21.04.2009 12:50:09)  [9]

Бог простит :-)


 
AIRDIGER ©   (2009-04-21 13:31) [11]


> KSergey ©   (21.04.09 12:12) [8]
> ТопикСтартеру: по ответам видно, что про вопрос в заголовке
> людям как бы и есть что сказать, но в коде ничерта не понятно,
>  выискивать в нем быги никому не охота.И беда именно в неудачной
> организации работы с данными: то дин. массивы, то какие-
> то указатели, все это перекручено/перенавернуто.


Согласен с вами, но проще не выходит... ВИН-АПИ так устроено, что проще нельзя ... просто всего сразу не возможно расказать что да как и почему.... тут нужно больше разбираться в самой структуре и организации РЕСУРСОВ и устройства PE - формата файлов... тогда  и будет понятны эти навороты..


> Сергей М. ©   (21.04.09 10:05) [7]
> > TGroupNameItems = Array of PGroupIconNameType;Почему не
> Array of TGroupIconNameType ?

Пришлось поменять просто раньше уже все работало  и лезть что-то менять в организацию данных боязно .. то опять что-нить вылетит..


> Anatoly Podgoretsky ©   (21.04.09 13:10) [10]
> > Игорь Шевченко  (21.04.2009 12:50:09)  [9]Бог простит
> :-)

 
Бог с кого спросить должен с Винды или с тех кто ее разработал? :-)


 
Игорь Шевченко ©   (2009-04-21 13:50) [12]


> ВИН-АПИ так устроено, что проще нельзя ... просто всего
> сразу не возможно расказать что да как и почему.... тут
> нужно больше разбираться в самой структуре и организации
> РЕСУРСОВ и устройства PE - формата файлов... тогда  и будет
> понятны эти навороты


тогда и код не надо показывать


> Бог с кого спросить должен с Винды или с тех кто ее разработал?
>  :-)


он прощает, а не спрашивает


 
MBo ©   (2009-04-21 13:51) [13]

мал-мал попроще:

function EnumLang(hm: THandle; typ, Name: PChar; wIDL: Word; lst: TStrings): Bool; stdcall;
begin
 lst.Add(IntToStr(wIDL));
 Result := True;
end;

function EnumNames(hm: THandle; typ, Name: PChar; lst: Tstrings): Bool; stdcall;
var
  Langs: TStringList;
begin
 Langs := TStringList.Create;
 EnumResourceLanguages(hInstance, RT_GROUP_ICON, Name, @EnumLang, Integer(Langs));
 Lst.Add(Name + " : " + Langs.CommaText);
 Langs.Free;
 Result := True;
end;

procedure TForm2.Button7Click(Sender: TObject);
begin
 EnumResourceNames(hInstance, RT_GROUP_ICON, @EnumNames, Integer(Memo1.Lines));
end;



 
AIRDIGER ©   (2009-04-21 14:11) [14]


> MBo ©   (21.04.09 13:51) [13]
> мал-мал попроще:function EnumLang(hm: THandle; typ, Name:
>  PChar; wIDL: Word; lst: TStrings): Bool; stdcall;begin
>  lst.Add(IntToStr(wIDL));  Result := True;end;function EnumNames(hm:
>  THandle; typ, Name: PChar; lst: Tstrings): Bool; stdcall;
> var   Langs: TStringList;begin  Langs := TStringList.Create;
>   EnumResourceLanguages(hInstance, RT_GROUP_ICON, Name,
> @EnumLang, Integer(Langs));  Lst.Add(Name + " : " + Langs.
> CommaText);  Langs.Free;  Result := True;end;procedure TForm2.
> Button7Click(Sender: TObject);begin  EnumResourceNames(hInstance,
>  RT_GROUP_ICON, @EnumNames, Integer(Memo1.Lines));end;


это конечно же код свашей колокольни удобен для МНУ он не приемлен
т.к.
1. используются классы (TString Listкласы в урну запихните - увеличивают код до безобразия )
2. использование Forms - это нужно туда же затокать поглубже где и классы..

мои критери:
+ должно быть создано в отдельном модуле
+ работать должно на чистом API
+ у меня весь проект после компиляции в консольной верисии не более 17кб.
  а если использовать КОЛ и оптимизированные системные модули то выходит 10-11кб. + упоковать = ~5-6 кб. программа и это на Delphi - А не СИ какой-нибудь хотя я против него ничего не имею...... ГЫ :-)


 
Andy BitOff ©   (2009-04-21 14:16) [15]


> AIRDIGER ©   (21.04.09 14:11) [14]

Молодой ысчё. Кому нужны эти размеры. Важно время разработки.


 
AIRDIGER ©   (2009-04-21 14:36) [16]


> MBo ©   (21.04.09 13:51) [13]
> мал-мал попроще:

Весь прикол был не втом чтобы структуры перечислить  и вывести на экран, а втом, что бы запомнить т.е. сохранить расположение структуры...
- при апдейте исонок из друго модуля необходимо старые удалять перед обновлением и удалять ресурс RT_GROUP_ICON, а затем уже записывать новые иконки и RT_GROUP_ICON.. Так вот перед тем как удалить старые нужно сохранить дерево ресурса и это лучше записать в деревовидную структуру.. Обясняю почему .... так как при удалении нужно вызвать две функции
1. hModule := LoadLibrary(PChar(FileSource));
  hModule - через него ведется перечисление и поиск ресурсов
2. hResUpdate := BeginUpdateResource(PChar(UpDateFile), False);

BeginUpdateResource  
  ....
     UpdateResource  
  ....
EndUpdateResource
 
  в открытой секции делаются обновления ресурсов циклом, но ясное же дело что в этой открытой секции невозможно искать и перечислять ресурсы по открытому hModule - его нужно закрыть ранее ...  BeginUpdateResource  EndUpdateResource по своей сути напоминает критические секции...
поэтому дерево ресурсов т.е. расположение их нужно заренее сохранить..


 
MBo ©   (2009-04-21 14:38) [17]

>используются классы
да, мне так проще было написать, и легко прочитать и понять.

Нет проблем сделать с массивами, будет только немножко длиннее, и стоит избегать перлов типа:
Integer(@PGroupNameItems(Ptr)^[Pred(Length(PGroupNameItems(Ptr)^))].Lang


 
Игорь Шевченко ©   (2009-04-21 14:39) [18]


> это конечно же код свашей колокольни удобен для МНУ он не
> приемлен


парься сам, все в твоих руках


 
AIRDIGER ©   (2009-04-21 14:47) [19]


> Andy BitOff ©   (21.04.09 14:16) [15]
> > AIRDIGER ©   (21.04.09 14:11) [14]Молодой ысчё. Кому нужны
> эти размеры. Важно время разработки


Ну да...  время оч. нужно ...вот  японаписал модулей разных для всяких задачь, которые не завист там  от каких-либо класов и других модулей каждый модуль сам по себе... как понадобился я его подключил к проекту быстро и удобно не нужно подгонять под что-либо и код инимум код по минимум... гы.. :-)


 
аноним   (2009-04-21 14:49) [20]

>Integer(@PGroupNameItems(Ptr)^[Pred(Length(PGroupNameItems(Ptr)^))].Lang

Кто там говорил, что слишком Си запутан


 
аноним   (2009-04-21 14:51) [21]

>Ну да...  время оч. нужно ...вот  японаписал модулей разных для всяких задачь, которые не завист там  от каких-либо класов и других модулей каждый модуль сам по себе... как понадобился я его подключил к проекту быстро и удобно не нужно подгонять под что-либо и код инимум код по минимум... гы.. :-)

А КОЛ не проще  использовать ?
Нужен маленький размер забуть о дельфи, учи Си


 
Ega23 ©   (2009-04-21 14:53) [22]

Либо очередной развод, либо очередной молодой дурачок.


 
AIRDIGER ©   (2009-04-21 15:07) [23]

> А КОЛ не проще  использовать ?
> Нужен маленький размер забуть о дельфи, учи Си

Учи Си - И зумучишся все руками писать... подглючи модуль "виндовс" и СИ станет ничем не меньше Делфи в делфи отключи все кроме модуля "Windows" и он станет ни чем не хуже СИ .......  зато в делфи в модуде "Windows" столько полезного ... А если использовать КОЛ так и  вообще ни каких не нада.. я пока и не думаю переползать на СИ .... хотя скоро придетия но лучше уже тогда на Fasm или masm32 - эти вообще еще крутяк...


 
Amoeba ©   (2009-04-21 23:23) [24]


> Ega23 ©   (21.04.09 14:53) [22]
>
> Либо очередной развод, либо очередной молодой дурачок.

Скорей второй случай.


 
Denis__ ©   (2009-04-21 23:30) [25]

Кого-то он мне напоминает... Deep в молодости)))



Страницы: 1 вся ветка

Текущий архив: 2009.06.07;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.011 c
2-1240423276
Igor2010
2009-04-22 22:01
2009.06.07
Form-ы


15-1238588488
Кое кто
2009-04-01 16:21
2009.06.07
Интересная задача


2-1240384955
Лёша
2009-04-22 11:22
2009.06.07
Как организовать данные?


2-1240322521
FEV
2009-04-21 18:02
2009.06.07
Управление другой программой


2-1240486269
js2
2009-04-23 15:31
2009.06.07
Загрузка записей из таблицы БД