Форум: "Основная";
Текущий архив: 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.008 c