![]() |
| ||
|
|
Новости |
Поиск |
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;
или есть метод какой-нибудь высвобождающий всё сразу что было добавленно в массив?
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?
экономит?)