Форум: "Прочее";
Текущий архив: 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.48 MB
Время: 0.04 c