Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.12.23;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.011 c
14-75400
Gorlum
2003-11-27 14:48
2003.12.23
Реляционные БД


14-75380
Vuk
2003-11-27 16:50
2003.12.23
Есть книга.


1-75189
Михаил
2003-12-11 14:17
2003.12.23
Tmemo


14-75330
Фагот
2003-12-01 11:01
2003.12.23
Инсталляция FB


11-75135
Bartov
2003-04-05 02:58
2003.12.23
MCK 1.70 - тормозит систему