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

Вниз

Постоянно сжирает память   Найти похожие ветки 

 
Igit   (2003-12-03 12:09) [0]

Моя программа (которая меняет обои) при каждой смене хапает памяти, как будто я что-то не освобождаю,вот код:

Procedure AllToBmp(src, dest : string);
var
_hFile : THANDLE;
szFile : string;
dwFileSize : DWORD;
_hGlobal : HGLOBAL;
pvData : Pointer;
dwBytesRead : DWORD;
bRead : BOOL;
IStm: IStream;
IPict:IPicture;
wIp,hIp : integer;

PBmp : PBitmap;
oh : OLE_HANDLE;
begin
szFile:=src;
// open file
_hFile :=CreateFile(PChar(szFile), GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
// get file size
dwFileSize := GetFileSize(_hFile, NIl);
pvData := NiL;
// alloc memory based on file size
_hGlobal := GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
if _hGlobal = 0 then
begin
CloseHandle(_hFile);
ShowMessage("Could not allocate memory for image");
exit;
end;
pvData := GlobalLock(_hGlobal);
if pvData = NIL then
begin
GlobalUnlock(_hGlobal);
CloseHandle(_hFile);
ShowMessage("Could not lock memory for image");
exit;
end;
dwBytesRead := 0;
// read file and store in global memory
bRead := ReadFile(_hFile, pvData^, dwFileSize, dwBytesRead, NIL);
GlobalUnlock(_hGlobal);
CloseHandle(_hFile);
if not bRead then
begin
ShowMessage("Could not read file");
exit;
end;
istm := NiL;
// create IStream* from global memory
CreateStreamOnHGlobal(_hGlobal, TRUE, istm);
// Destroy last picture if exists
OleLoadPicture(istm, dwFileSize, FALSE, IID_IPicture, IPict);
istm.Release;

Ipict.get_Width(wIp);
Ipict.get_Height(hIp);

PBmp := nil;
PBmp := NewBitmap(wIp, hIp);

Ipict.get_Handle(oh);
PBmp.Handle := oh;
PBmp.SaveToFile(dest);
Pbmp.ReleaseHandle;
Pbmp.Free;

Ipict.Release;
end;


 
Amoeba   (2003-12-03 12:19) [1]

А куда у тебя пропал вызов GlobalFree(_hGlobal)?


 
Igit   (2003-12-03 12:23) [2]

Проблема осталась, видно еще что-то забыл


 
Amoeba   (2003-12-03 12:35) [3]

Посмотри по справке, вызов каких API ф-ий еще требуе последующего вызова других, освобождающих ресурсы. Хотя это более чем тривиальный совет.


 
Igit   (2003-12-03 12:57) [4]

Я трассировал программу, вот состояние памяти в этой процедуре
(количество занимаемой памяти после выполнения указанной строки)

1) _hFile :=CreateFile(PChar(szFile), GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0); - 7 168 kb
2) _hGlobal := GlobalAlloc(GMEM_MOVEABLE, dwFileSize); - 7 168 kb
3) bRead := ReadFile(_hFile, pvData^, dwFileSize, dwBytesRead, NIL); - 7 340 kb
4) OleLoadPicture(istm, dwFileSize, FALSE, IID_IPicture, IPict); - 9 304 kb
5) istm.Release; - 9 108 kb
6) Pbmp.ReleaseHandle; - 10 648 kb
7) Pbmp.Free - 9 108 kb
8) GlobalFree(_hGlobal); 9 102 kb


 
Amoeba   (2003-12-03 13:02) [5]

Для поиска утечек памяти есть оч. хорошая (и при этом бесплатная!) утилита MemProof:
http://www.automatedqa.com/downloads/memproof.asp
Рекомендую иметь ее у себя.

P.S. К сожелению, Help включен только в предпоследнюю версию (но он гидится и для последней).


 
Igit   (2003-12-03 18:35) [6]

В С IPIc отчищался бы так : Ipict.lpVtbl.Release(Ipict);
а как в дельфе?


 
BlackTiger   (2003-12-03 18:49) [7]

А как насчет освободить _hFile?


 
Igit   (2003-12-04 07:05) [8]

Да вроде освобождать-то не надо, разве только это - CloseHandle(_hFile);

Ну а в моем случае память теряется после OleLoadPicture...


 
Igit   (2003-12-05 23:10) [9]

Эй, ну помогите, я уже не знаю куда деваться :(((


 
Игорь Шевченко   (2003-12-06 00:47) [10]

Igit © (05.12.03 23:10)

Сказали же: MemProof


 
Igit   (2003-12-11 08:58) [11]

Ура, я разобрался!
убрал Pbmp.ReleaseHandle
все вынес в отдельную dll
Istream и Ipicture присвоил nil


 
REA   (2003-12-11 10:07) [12]

Не уверен, что после Exit (3 раза в коде) будут также освобождаться ресурсы. Лучше Try Raise Finally.



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

Форум: "Основная";
Текущий архив: 2003.12.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.007 c
4-75450
Sfagnum
2003-10-23 12:04
2003.12.23
Значение SES_EMULATESYSEDIT


14-75360
Bucks
2003-11-28 17:56
2003.12.23
как узнать свой почтовый адрес


7-75427
Yurko
2003-10-16 11:10
2003.12.23
Время ожидания для принтера


14-75323
Думкин
2003-12-01 06:38
2003.12.23
С днем рождения! 1 декабря.


3-75111
tchn
2003-11-28 14:39
2003.12.23
SQLDirect, MSSQL, (10029)Maximum number of DBPROCESSes already al





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