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;

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


Denis__   (2009-04-21 23:30:00) [1]

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


Amoeba   (2009-04-21 23:23:00) [2]


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

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


AIRDIGER   (2009-04-21 15:07:00) [3]

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

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


Ega23   (2009-04-21 14:53:00) [4]

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


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

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

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


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

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

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


AIRDIGER   (2009-04-21 14:47:00) [7]


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


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


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


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


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


MBo   (2009-04-21 14:38:00) [9]

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

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


AIRDIGER   (2009-04-21 14:36:00) [10]


> 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по своей сути напоминает критические секции...
поэтому дерево ресурсов т.е. расположение их нужно заренее сохранить..


Andy BitOff   (2009-04-21 14:16:00) [11]


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

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


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


> 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 - А не СИ какой-нибудь хотя я против него ничего не имею...... ГЫ :-)


MBo   (2009-04-21 13:51:00) [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;


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


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


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


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


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


AIRDIGER   (2009-04-21 13:31:00) [15]


> 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]Бог простит
> :-)

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


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

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

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


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


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


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


KSergey   (2009-04-21 12:12:00) [18]

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

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


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


> TGroupNameItems = Array of PGroupIconNameType;


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


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

> А нафига packed?

экономит?)


Страницы:   1 2

Наверх

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