Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.06.07;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.005 c
2-1240486269
js2
2009-04-23 15:31
2009.06.07
Загрузка записей из таблицы БД


4-1210912319
Sirus
2008-05-16 08:31
2009.06.07
Управление печатью средствами Дельфи


15-1236792104
Сергей М.
2009-03-11 20:21
2009.06.07
О цифровых пиано


11-1201454662
ntg13_
2008-01-27 20:24
2009.06.07
ищу редактор блок-схем на КОЛ


15-1238603200
Городской Шаман
2009-04-01 20:26
2009.06.07
Microsoft уроды со своей VS.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский