Главная страница
    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-75462
Avgurin
2003-10-29 09:23
2003.12.23
Перехват выхода из Windows


1-75265
Паша555
2003-12-09 22:31
2003.12.23
Какая функция вычисляет корень кубический????


14-75333
ДмитрийБ
2003-12-01 06:05
2003.12.23
The Bat!


7-75421
OTMOPO3OK
2003-10-03 12:13
2003.12.23
Как сделана AIDA: инфа от S.M.A.R.T.; инфа о сост. материнки


6-75297
Zoltan
2003-10-26 21:15
2003.12.23
Привет всем!есть вопрос как скачать только 100кб,а не весь файл





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