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

Вниз

Как освободить память?   Найти похожие ветки 

 
Mem   (2008-05-18 07:37) [0]

Вот выделяем память:
FImages := SHGetFileInfo("C:\", 0, FileInfo, SizeOf(FileInfo), SHGFI_SYSICONINDEX or SHGFI_SMALLICON);

Дальше её надо как-то осовободить, чтоб утечек небыло. А как правильно?


 
@!!ex ©   (2008-05-18 09:21) [1]

If SHGetFileInfo returns an icon handle in the hIcon member of the SHFILEINFO structure pointed to by psfi, you are responsible for freeing it with DestroyIcon when you no longer need it.

Note  Once you have a handle to a system image list, you can use the Image List API to manipulate it like any other image list. Because system image lists are created on a per-process basis, you should treat them as read-only objects. Writing to a system image list may overwrite or delete one of the system images, making it unavailable or incorrect for the remainder of the process.
You must initialize Component Object Model (COM) with CoInitialize or OleInitialize prior to calling SHGetFileInfo.

(C)MSDN


 
@!!ex ©   (2008-05-18 09:22) [2]

А сам FileInfo вроде просто FreeMem и все...


 
Loginov Dmitry ©   (2008-05-18 09:50) [3]

> А сам FileInfo вроде просто FreeMem


Или GlobalFreePtr()?
:)


 
@!!ex ©   (2008-05-18 10:14) [4]

> [3] Loginov Dmitry ©   (18.05.08 09:50)

Эм. Ну это уж вам виднее.


 
Loginov Dmitry ©   (2008-05-18 10:23) [5]

> Эм. Ну это уж вам виднее.


Запутал меня своим FreeMem() ^)

FileInfo - указатель на обычный рекорд. Можно вообще не создавать, а просто переменную объявить. Что у автора - мы не знаем :)


 
old_lamer   (2008-05-18 10:37) [6]


> @!!ex ©   (18.05.08 09:22) [2]


> Loginov Dmitry ©   (18.05.08 09:50) [3]

а как узнать вообще, чем освобождать память в каждом конкретном случае?


 
@!!ex ©   (2008-05-18 10:39) [7]

> [6] old_lamer   (18.05.08 10:37)

Зависит от того, где она выделяется.

Если она выделяется в dll то надо удалять функциями dll(тоесть в самой dll должна память освобождаться), если ShareMem не используется.
Если выделяется в программе, то и удалятся там же должна.
Если выдетяеся в API(Я с таким еще не сталкивался, но наверно оно есть), то и удалятся должно средствами API.


 
Loginov Dmitry ©   (2008-05-18 10:40) [8]

> а как узнать вообще, чем освобождать память в каждом конкретном
> случае?


Очень просто. Каким менеджером памяти создавал, тем и уничтожай.
Дельфевым создавал, значит Дельфевым и удаляй. Виндовым создавал, значит Виндовым и удаляй.


 
Loginov Dmitry ©   (2008-05-18 10:43) [9]

Дополню [7]
Если dll создается без ShareMem, то в нее компилируется код менеджера памяти. Если у тебя куча dll без ShareMem, то в приложении работает куча менеджеров памяти. Но правило то же - Каким менеджером памяти создавал, тем и уничтожай.


 
old_lamer   (2008-05-18 10:52) [10]

ясно, спс


 
Loginov Dmitry ©   (2008-05-18 11:04) [11]

Кстати, в [0] лажа написана.

Если FileInfo объявлена как SHFILEINFO, то она не подходит в качестве параметра функции
Если FileInfo объявлена как PSHFileInfo, то SizeOf() вернет 4.
Нас намеренно хотят запутать! =)


 
Loginov Dmitry ©   (2008-05-18 11:06) [12]

> Нас намеренно хотят запутать!


function SHGetFileInfo(pszPath: PAnsiChar; dwFileAttributes: DWORD;
 var psfi: TSHFileInfo; cbFileInfo, uFlags: UINT): DWORD; stdcall;

какой гад придумал VAR?
:((


 
Ни понял...   (2008-05-18 11:09) [13]

> [12] Loginov Dmitry ©   (18.05.08 11:06)

Я тоже так думаю. :)


 
Loginov Dmitry ©   (2008-05-18 11:12) [14]

Надо посты [2], [3], [4], [5], [11], [12] резать. Лажанулись по полной :(


 
Mem   (2008-05-19 03:44) [15]


> Loginov Dmitry ©   (18.05.08 10:23) [5]
> Что у автора - мы не знаем :)



> Loginov Dmitry ©   (18.05.08 11:04) [11]
>
> Кстати, в [0] лажа написана.


Авторы - Борланд и исходники Дельфи 7. Так, что вы пожалуйста не очень то наезжайте на отцов-основателей.

Так вот, там утечка памяти, вот я и ищу как её пофиксить за ними.


 
Loginov Dmitry ©   (2008-05-19 07:45) [16]

> Авторы - Борланд и исходники Дельфи 7. Так, что вы пожалуйста
> не очень то наезжайте на отцов-основателей.


Пост [12] и [14] прочитай, ок?!!!!


 
Loginov Dmitry ©   (2008-05-19 08:04) [17]

> Так вот, там утечка памяти, вот я и ищу как её пофиксить
> за ними.


Вот такой вот код:


procedure TForm1.Button1Click(Sender: TObject);
var
 FileInfo: TSHFileInfo;
 FImages: THandle;
 I: Integer;
begin
 for i := 1 to 10000 do
 begin
   FillChar(FileInfo, SizeOf(FileInfo), 0);
   FImages := SHGetFileInfo("C:\", 0, FileInfo, SizeOf(FileInfo), SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
 end;
end;


Не приводит к какой либо утечке памяти (Win XP SP2).


 
Mem   (2008-05-20 04:50) [18]


> Loginov Dmitry ©   (19.05.08 08:04) [17]
>
> Вот такой вот код:
> Не приводит к какой либо утечке памяти (Win XP SP2).


А ты вызывай с теми же параметрами, что и Borland.



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

Форум: "Прочее";
Текущий архив: 2008.06.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.04 c
15-1210925436
Ega23
2008-05-16 12:10
2008.06.29
Года полтора-два назад тема была


2-1212463198
n00b xDD
2008-06-03 07:19
2008.06.29
DEC to HEX(а точнее как инт показать в виде 16ого числа)


3-1200920739
S@shka
2008-01-21 16:05
2008.06.29
Передать в UDF TimeStamp


15-1210935784
deadteachers
2008-05-16 15:03
2008.06.29
помогите разобраться?


2-1212146748
chargos
2008-05-30 15:25
2008.06.29
Обновление данных на форме





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский