Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.08.2016, 12:30   #1
yan11
Пользователь
 
Регистрация: 15.08.2016
Сообщений: 14
По умолчанию TBitmap Оставляет мусор в памяти

Почему функция CaptureScreenRect ест столько памяти и как правильно освободить Bitmap после выхода из функции ?

Прикрепил скриншот Unexpected Memory Leak


Код:
for i := 1 to 500 do
begin

CaptureScreenRect(Rect(0,0,
                0 + 50,
                0 + 50));
end;

Код:
function CaptureScreenRect(aRect: TRect): TBitMap;
var
 ScreenDC: HDC;
begin
 Result := TBitMap.Create;
 Result.Width := aRect.Right - aRect.Left;
 Result.Height := aRect.Bottom - aRect.Top;
 ScreenDC := CreateDC(PChar('DISPLAY'), nil, nil, nil);
 try
   SetStretchBltMode(Result.Canvas.Handle, HALFTONE);
   StretchBlt(Result.Canvas.Handle, 0, 0, Result.Width, Result.Height, ScreenDC, aRect.Left, aRect.Top, Result.Width, Result.Height, SRCCOPY);

//   BitBlt(Result.Canvas.Handle, 0, 0, Result.Width, Result.Height, ScreenDC, aRect.Left, aRect.Top, SRCCOPY);
 finally
   ReleaseDC(0, ScreenDC);
 end;
end;
Изображения
Тип файла: jpg 2.jpg (52.0 Кб, 182 просмотров)
yan11 вне форума Ответить с цитированием
Старый 16.08.2016, 12:35   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

А вы чего хотели - создали 500 битмапов и ниодин не освободили... Free для них кто будет вызывать?
p51x вне форума Ответить с цитированием
Старый 16.08.2016, 12:42   #3
yan11
Пользователь
 
Регистрация: 15.08.2016
Сообщений: 14
По умолчанию

Но как мне его освободить если его возвращает функция ? Мне нужно освобождать внутри функции или как ?
yan11 вне форума Ответить с цитированием
Старый 16.08.2016, 12:45   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Функция и возвращает указатель на bitmap. Сохраняй их, например, в массиве. Освобождай когда нужно
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.08.2016, 13:22   #5
yan11
Пользователь
 
Регистрация: 15.08.2016
Сообщений: 14
По умолчанию

Сохранил в массив указатели, но как мне теперь их освободить по указателю ? Dispose видимо что-то не то...

Код:
var
mbit: TBitmap;
P: ^TBitmap;
Pointers  : Array[1..100] of Pointer;

---------------

for i := 1 to 10 do
begin

mbit:= CaptureScreenRect(Rect(0,0,
                0 + 50,
                0 + 50));

P:=@mbit;
Pointers[i]:=@mbit;
Memo1.Lines.Add(IntToStr(Integer(Pointers[i])));

end;



for i := 1 to 10 do
begin
//  Dispose(Pointers[i]);
end;

---------------
yan11 вне форума Ответить с цитированием
Старый 16.08.2016, 13:34   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вы не разу не работали с объектами?
не нужны вам указатели.
вообще делайте проще, получили TBitmap, обработали, вызвали Free у него.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 16.08.2016, 13:41   #7
yan11
Пользователь
 
Регистрация: 15.08.2016
Сообщений: 14
По умолчанию

Я не пойму как мне освободить TBitmap который возвращает функция CaptureScreenRect.


Код:
for i := 1 to 100 do
begin

mbit:=TBitmap.Create;

mbit:= CaptureScreenRect(Rect(0,0,
                0 + 50,
                0 + 50));

mbit.Free;

end;
Изображения
Тип файла: jpg 3.jpg (36.9 Кб, 155 просмотров)
yan11 вне форума Ответить с цитированием
Старый 16.08.2016, 13:52   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Код:
var mbit: TBitmap;

mbit:= CaptureScreenRect(Rect(0,0,
                0 + 50,
                0 + 50));
mbit.Free;
Цитата:
mbit:=TBitmap.Create;
это не надо, объект функция создает. А mbit и содержит указатель на созданный битмап
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 16.08.2016 в 13:56.
Аватар вне форума Ответить с цитированием
Старый 16.08.2016, 13:54   #9
yan11
Пользователь
 
Регистрация: 15.08.2016
Сообщений: 14
По умолчанию

Это гениально

Последний раз редактировалось yan11; 16.08.2016 в 17:35.
yan11 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Утечка памяти в потоке при многократной обработке TBitmap planetoxod Мультимедиа в Delphi 5 05.03.2015 19:33
Оставляет-ли флэш-карта следы andruhin.ch Помощь студентам 7 08.04.2013 18:46
Мусор в памяти monro86 Visual C++ 0 10.04.2012 15:04
Недостаточно памяти для обработки команды TBitMap finder_sl Мультимедиа в Delphi 12 03.03.2010 20:40
Массив TBitmap, "Недостаточно памяти для обработки команды" Роман Радер Мультимедиа в Delphi 5 05.04.2009 18:14