Форум программистов, компьютерный форум, киберфорум
C++ Builder: FireMonkey
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/163: Рейтинг темы: голосов - 163, средняя оценка - 4.64
1 / 0 / 0
Регистрация: 24.08.2016
Сообщений: 9

Утечка памяти при работе с Graphics::TBitmap

17.07.2020, 11:21. Показов 37855. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть код (получаю картинку с IP-камеры):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
TIdHTTP *IdHTTP = new TIdHTTP (NULL);
IdHTTP->Request->Username = "admin";
IdHTTP->Request->Password = "admin";
TMemoryStream *Stream = new TMemoryStream;
TJPEGImage *Jpeg = new TJPEGImage;
Graphics::TBitmap *pBitmap = new Graphics::TBitmap;
pBitmap->PixelFormat = pf24bit;
Stream->Position = 0;
IdHTTP->Get("АдресЗадаюТут", Stream);
Stream->Position = 0;
Jpeg->LoadFromStream(Stream);
pBitmap->Assign(Jpeg);
// Здесь считываю с pBitmap картинку
Удаляю:
C++
1
2
3
4
delete IdHTTP;
delete Stream;
delete Jpeg;
delete pBitmap;
память не освобождается. Никто не подскажет причину? Спасибо
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.07.2020, 11:21
Ответы с готовыми решениями:

Утечка памяти Fmx::Graphics::TBitmap
Привет! Кто-нибудь сталкивался с утечкой памяти загрузке картинки из файла или из потока в TBitmap? для теста вот такой вот кусок кода...

Утечка памяти в потоке при многократной обработке TBitmap
Делфи7. Создаётся поток, где в цикле создаётся Bitmap1 (5МByte), который сравнивается c Bitmap2, далее Bitmap1.Free; Sleep(5000);...

TBitMap Canvas в многопотоке утечка памяти
И так для теста на писал не сколько функций. Тут все нормально очищает: procedure TForm1.Button3Click(Sender: TObject); var ...

15
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33187 / 21484 / 8232
Регистрация: 22.10.2011
Сообщений: 36,859
Записей в блоге: 12
17.07.2020, 11:59
Цитата Сообщение от protexprotex Посмотреть сообщение
память не освобождается
Откуда известно? Хинт: ответ "TaskManager показывает" не принимается. Проверяйте альтернативными средствами. Например, ProcessExplorer-ом от SysInternals
0
Модератор
 Аватар для D1973
9903 / 6441 / 2454
Регистрация: 21.01.2014
Сообщений: 27,342
Записей в блоге: 3
17.07.2020, 12:05
Создавать и удалять надо в одной области видимости (хотя, по хорошему, Вы бы AV иначе получали)...
Попробуйте через "умные указатели" объявить: не так вот
C++
1
2
3
4
5
TIdHTTP *IdHTTP = new TIdHTTP (NULL);
TJPEGImage *Jpeg = new TJPEGImage;
...
delete IdHTTP;
delete Jpeg;
а вот так:
C++
1
2
3
4
#include <memory>
...
std::auto_ptr<TIdHTTP> IdHTTP (new TIdHTTP(NULL));
std::auto_ptr<TJPEGImage> Jpeg (new TJPEGImage);
0
1 / 0 / 0
Регистрация: 24.08.2016
Сообщений: 9
17.07.2020, 12:20  [ТС]
Ну это понятно, что в одной области видимости. Так все и сделано. Если бы я их объявил в разных областях, то и delete к указателю не смог применить - т.к. он был бы не "видим" в другой области видимости и компилятор его не прожевал бы. Т.е. такая схема была бы зарублена компилятором на момент компиляции:
C++
1
2
3
4
5
6
{
TIdHTTP *IdHTTP = new TIdHTTP (NULL);
}
{
delete IdHTTP;
}
так: компилятор бы пропустил, но это был бы бред:
C++
1
2
3
4
5
6
7
TIdHTTP *IdHTTP;
{
IdHTTP = new TIdHTTP (NULL);
}
{
delete IdHTTP;
}
у меня другая странная ситуация. И объявление через std::auto_ptr здесь не вижу смысла, т.к. по тексту программы все логично и должно работать.

Добавлено через 5 минут
Нет. Через "TaskManager показывает" - это старый прикол у программистов. Даже анекдот был такой где-то:-)
Утечка памяти именно тут. Т.к. запускаю этот блок в цикле и память выжирается на компе за полминуты вся. Я бы понял если бы мегабайт-два. Но пять гигов на компе улетает и TaskManager-ом видно даже.

Добавлено через 2 минуты
Вопрос простой - может я где - то с кодом налажал - и глаз замылился. Но вроде все правильно. Тут три сосны - вроде бы не заблудился?
0
 Аватар для Annemesski
2670 / 1333 / 479
Регистрация: 08.11.2016
Сообщений: 3,679
17.07.2020, 14:04
protexprotex,
Цитата Сообщение от protexprotex Посмотреть сообщение
Тут три сосны
тут да, но откуда уверенность что протечка именно тут?
0
1 / 0 / 0
Регистрация: 24.08.2016
Сообщений: 9
17.07.2020, 14:43  [ТС]
Цитата Сообщение от D1973 Посмотреть сообщение
2
3
4
5
TIdHTTP *IdHTTP
Тут. Уверен. TIdHTTP *IdHTTP - ведь потоконебезопасен. Я его создаю в отдельном потоке, работаю с ним в этом потоке и потом его в нем же и уничтожаю. Надо проверить может из-за этого траблы....
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
17.07.2020, 19:15
protexprotex, больше кода покажите.
0
1 / 0 / 0
Регистрация: 24.08.2016
Сообщений: 9
17.07.2020, 19:27  [ТС]
Да там проект на полмиллиона строк. И ссылок функций друг на друга полно. Эта часть кода которая если исключить ее, то утечки не будет. Счас проверю пару идей.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
17.07.2020, 22:31
protexprotex, ну тогда вам никто не поможет наверняка. Вот вы пишете
Цитата Сообщение от protexprotex Посмотреть сообщение
Вопрос простой - может я где - то с кодом налажал - и глаз замылился.
это совершенно очевидно, что "налажали", но где именно без кода вам никто не скажет. Так что если не можете выделить проблемный участок с контекстом, чтобы дать другим посмотреть, то только телепатов ждать.
0
1 / 0 / 0
Регистрация: 24.08.2016
Сообщений: 9
20.07.2020, 08:54  [ТС]
Спасибо. Я просил посмотреть только этот код который я выложил здесь. Мне не нужны телепаты. С этим кодом все в порядке. Проблема где - то глубже. Сам разберусь.
0
фрилансер
 Аватар для Алексей1153
6440 / 5634 / 1127
Регистрация: 11.10.2019
Сообщений: 14,980
20.07.2020, 10:09
Цитата Сообщение от protexprotex Посмотреть сообщение
Я просил посмотреть только этот код который я выложил здесь.
окай

Цитата Сообщение от protexprotex Посмотреть сообщение
Проблема где - то глубже.
проблема тут

Цитата Сообщение от protexprotex Посмотреть сообщение
TIdHTTP *IdHTTP = new TIdHTTP (NULL);
IdHTTP->Request->Username = "admin";
IdHTTP->Request->Password = "admin";
TMemoryStream *Stream = new TMemoryStream;
TJPEGImage *Jpeg = new TJPEGImage;
Graphics::TBitmap *pBitmap = new Graphics::TBitmap;
Цитата Сообщение от protexprotex Посмотреть сообщение
delete IdHTTP;
delete Stream;
delete Jpeg;
delete pBitmap;
потому что в не выложенном коде тоже, как я понимаю, идёт пренебрежение автоуправлением памяти

кстати, даже в этой лапше логическая ошибка (которую автоуправление памятью не допустит): удаление нужно производить в порядке, обратном порядку создания
0
Модератор
 Аватар для D1973
9903 / 6441 / 2454
Регистрация: 21.01.2014
Сообщений: 27,342
Записей в блоге: 3
20.07.2020, 10:33
Цитата Сообщение от Алексей1153 Посмотреть сообщение
удаление нужно производить в порядке, обратном порядку создания
Алексей1153, я не буду спорить и что-то утверждать, но ИМХО - это не критично... Я создаю объекты А и В, когда мне надо и удаляю, когда они мне не нужны... И если объект А был создан ранее объекта В, но объект А перестал мне быть нужен, а объект В я еще использую - я не буду ждать, пока и этот В мне надоест, я просто удалю А...
0
1 / 0 / 0
Регистрация: 24.08.2016
Сообщений: 9
20.07.2020, 10:33  [ТС]
"удаление нужно производить в порядке, обратном порядку создания" - это почему?
т.е. так:

int *m1 = new int[10];
int *n1 = new int[10];

delete []m1;
delete []n1;

не тоже самое что

int *m1 = new int[10];
int *n1 = new int[10];

delete []n1;
delete []m1;

? -

обоснуйте Вашу мысль, пжл. В чем разница.
И по поводу автоуправления памятью тоже не понял. Если я все корректно сделал, то автоуправление не нужно.
0
фрилансер
 Аватар для Алексей1153
6440 / 5634 / 1127
Регистрация: 11.10.2019
Сообщений: 14,980
20.07.2020, 11:09
Цитата Сообщение от D1973 Посмотреть сообщение
я не буду спорить и что-то утверждать
D1973, protexprotex,
я тоже спорить не буду. Когда объекты меж собой не связаны, порядок неважен, конечно же. Но а вдруг они будут связаны? Тогда все "внутренние" объекты нужно удалить ранее, чем будет удалён "внешний" (при инкапсуляции или при создании на стеке порядок удаления будет построен автоматически, а вручную можно ошибиться)

Зачем закладывать возможность ошибки, когда можно этого не делать ?

Цитата Сообщение от protexprotex Посмотреть сообщение
т.е. так:.....не тоже самое что
- то же самое, объекты не связаны между собой

Кстати, когда найдётся утечка в том самом другом коде, интересно было бы узнать причину

Добавлено через 4 минуты
к слову, когда-то, на заре своей практики, я не признавал STL и пользовался исключительно самописными контейнерами и, конечно же, обилием new и delete

когда я понял, что это источник багов по невнимательности и потеря времени, я стал пользоваться STL и инкапсуляцией.
Я уже давно забыл, что такое утечка памяти, мне сейчас в своём коде очень сложно создать такую ситуацию, когда она будет
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
20.07.2020, 11:19
protexprotex, если кратко, то Алексей1153 говорит вам про "системную" ошибку. Т.е. глобально причина в том, что вы полагаетесь на свою внимательность:
Цитата Сообщение от protexprotex Посмотреть сообщение
Если я все корректно сделал
В этом подходе есть проблема, потому что всегда присутствует человеческий фактор. Современный С++ позволяет переложить большую часть проблем "внимательности" на компилятор, устранив тем самым человеческий фактор. Во многих ситуациях это достигается бесплатно (с точки зрения производительности).

Это глобальный взгляд на проблему, а не указание конкретной ситуации. Когда он выделил все new в вашем коде, это не означало, что проблема конкретно в них, но означало, что это "системный" фактор указывающий вашу приверженность ручному контролю.
0
1 / 0 / 0
Регистрация: 24.08.2016
Сообщений: 9
20.07.2020, 11:25  [ТС]
Хм. Если объекты между собой связаны, то тогда даже автоуправление памятью Вам не поможет. Это уже баг программера на уровне логики работы программы.
По поводу "когда найдётся утечка в том самом другом коде" - у меня вопрос был именно по этому выложенному коду. Свой баг я найду. Это просто дело времени. День-два. Тут не проблема что не удалил объект, а насколько я понял с передачей указателя на элемент списка при построении дерева. И где - то (ищу где) этот указатель при начале функции не на начало списка, а на конец. И тут список нарастает бесконтрольно.

Добавлено через 3 минуты
Там блок на 10 строк. Городить огород там не нужно с автораспределением памяти. Но это дело каждого. У меня свой стиль. У Вас другой. Подобного рода ошибки у меня возникают исключительно редко. Хотя проекты на сотни тысяч строк. Т.к. когда создаю объект (new) то сразу пишу delete для него. И проблем нет. Тут именно с указателем на структуру проблема. И Ваше автораспределение памяти тут не поможет никак
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.07.2020, 11:25
Помогаю со студенческими работами здесь

Утечка памяти при работе с PictureBox!
Здравствуйте, у меня такой вопрос, я создал программу для просмотра изображений, т.е. есть listbox со списком файлов, при выборе...

утечка памяти при работе с матрицей
нужно сформировать массив, в который записываем 0, если все элементы столбца матрицы равны нулю, в противном случае пишем 1 Происходит...

Утечка памяти при работе со строками в TList
Есть следующий код: var s2: string; pString: ^String; n:byte; begin TListString := TList.Create;

Утечка памяти при работе с файлами TIFF
Здравствуйте! Помогите найти утечку памяти, читал msdn, но так и не понял как это сделать вот и обработчик с методами private void...

Утечка памяти из Graphics
День добрый, возникла такая проблема. Есть две формы, на одной из них PictureBox, в котором все время обновляется изображение, старое...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru