Форум программистов
 
Расширенный поиск
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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



Ответ
 
Опции темы
Старый 16.08.2016, 13:30   #1
yan11
Пользователь
 
Регистрация: 15.08.2016
Сообщений: 14
Репутация: 10
По умолчанию 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 Кб, 42 просмотров)
yan11 вне форума   Ответить с цитированием
Старый 16.08.2016, 13:35   #2
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 8,630
Репутация: 1341

icq: 216409213
По умолчанию

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

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

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

Сохранил в массив указатели, но как мне теперь их освободить по указателю ? 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, 14:34   #6
Пепел Феникса
Модератор
Заслуженный модератор
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 20,840
Репутация: 3322

icq: 446843180
skype: phoenix_proger
По умолчанию

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

Я не пойму как мне освободить 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 Кб, 41 просмотров)
yan11 вне форума   Ответить с цитированием
Старый 16.08.2016, 14:52   #8
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк, Украина
Сообщений: 15,478
Репутация: 5668
По умолчанию

Код:

var mbit: TBitmap;

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

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

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

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

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



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Утечка памяти в потоке при многократной обработке TBitmap planetoxod Мультимедиа в Delphi 5 05.03.2015 20: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 21:40
Массив TBitmap, "Недостаточно памяти для обработки команды" Роман Радер Мультимедиа в Delphi 5 05.04.2009 18:14




14:38.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

Покупайте на сайте www.skinon.ru уникальные чехлы и наклейки для телефонов.
таргетированный трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru