Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
 Аватар для ijonhson
47 / 47 / 15
Регистрация: 09.03.2011
Сообщений: 584

Как удалять объект Graphics::TBitmap

06.03.2013, 05:34. Показов 4347. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
подскажите пож.как удалять объект Graphics::TBitmap *,в одних книгах написано что builder сам подчищает такой мусор в других что это необходимо делать вручную.
Несмотря на то что и где написано code guard не ругается на объявленные и неудалённые объекты.
при попытке написать в функции удаление методом delete компиляция проходит гладко,но при повторном использовании функции программа вылетает на месте первого обращения к вновь объявленному bitmap
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.03.2013, 05:34
Ответы с готовыми решениями:

как вернуть HBITMAP у Graphics::TBitmap
Добрый вечер! Есть функция вставляющая картинки в видео по их хэндлу: HRESULT AddAviFrame(HAVI avi, HBITMAP hbm) { if (avi==NULL)...

как освободить память из под Graphics::TBitmap
Всем привет! Возникла такая проблема: Создаю указатель Graphics::TBitmap, выделяю под него память: Graphics::TBitmap *oBMP =...

Повернуть изображение Graphics::TBitmap
Есть одно загруженное изображение Graphics::TBitmap *Temp Есть пустое изображение куда надо отобразить повернутое на заданный угол,...

18
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
06.03.2013, 08:35
Чего динамически навыделяли сами, сами же и освобождаем. Исключением могут являться лишь те объекты VCL, у которых конструктор требует параметр AOwner - если его корректно передать, то объект, на который он указывает, станет владельцем и освободит выделенную нами память при своем разрушении.

Есть альтернативные способы управления памятью, например, очень удобным может быть контейнер
C++
1
std::auto_ptr<Graphics::TBitmap> bmp( new Graphics::TBitmap(  ) );
bitmap будет существовать, пока существует экземпляр auto_ptr. Разумеется, можно очистить память и по желанию при таком подходе:
C++
1
bmp.reset(  ); // delete будет неявно вызван для нашего bitmap
std::auto_ptr
1
 Аватар для ijonhson
47 / 47 / 15
Регистрация: 09.03.2011
Сообщений: 584
06.03.2013, 09:07  [ТС]
спасибо удобная вещь,один только момент почему же code guard не ругается на утечку памяти
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
07.03.2013, 19:18
Цитата Сообщение от ijonhson Посмотреть сообщение
почему же code guard не ругается на утечку памяти
Ты уверен, что он у тебя не выключен?

У меня на CBuilder 2010 прекрасно отлавливается утечка
C++
1
2
3
4
5
void __fastcall TForm3::Button1Click(TObject *Sender)
{
    Graphics::TBitmap *ABitmap = new Graphics::TBitmap;
}
//---------------------------------------------------------------------------
Миниатюры
Как удалять объект Graphics::TBitmap   Как удалять объект Graphics::TBitmap  
2
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.03.2013, 20:29
Чет я не как смекну его настроить...
Миниатюры
Как удалять объект Graphics::TBitmap  
0
 Аватар для ijonhson
47 / 47 / 15
Регистрация: 09.03.2011
Сообщений: 584
07.03.2013, 21:18  [ТС]
builder 6,вроде всё включено
Миниатюры
Как удалять объект Graphics::TBitmap  
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
16.03.2013, 01:57
Вообще еще тут галочку вкладка CodeGuard появилось но на ней нет инфы об утечке
Миниатюры
Как удалять объект Graphics::TBitmap  
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
16.03.2013, 14:19
Вот здесь подробно расписано, как пользоваться CodeGuard

Добавлено через 1 минуту
В частности про утечку памяти
0
7 / 7 / 2
Регистрация: 16.11.2011
Сообщений: 251
17.03.2013, 21:27
Цитата Сообщение от Maluda Посмотреть сообщение
Ты уверен, что он у тебя не выключен?

У меня на CBuilder 2010 прекрасно отлавливается утечка
C++
1
2
3
4
5
void __fastcall TForm3::Button1Click(TObject *Sender)
{
    Graphics::TBitmap *ABitmap = new Graphics::TBitmap;
}
//---------------------------------------------------------------------------
А как понять в какой именно строке кода ошибка? Строка выделяется в режиме кода ассемблера (или как она правильно отображается), а что ей соответствует не могу знать. У Вас на второй картинке, вкладка CPU, выделена строка, как Вы поняли что она соответствует строке
C++
1
Graphics::TBitmap *ABitmap = new Graphics::TBitmap;
1
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
17.03.2013, 22:52
По двойному клику на пункте ошибки в messages отображается позиция. Но вопрос сформулирован хорошо.
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
18.03.2013, 03:06
Немного личного практического опыта использования CodeGuard.

История такая: попадает ко мне один проект, в котором происходит постоянная утечка памяти.
Я подключаю CodeGuard, по завершению, он действительно отслеживает, что есть утечка,
но по двойному щелчку на этой ошибке меня выкидывает в system.pas. То есть я понимаю,
что это какой-то VCL объект, но какой??
Сначала решил попробовать отследить все VCL объекты, которые создаются динамически в проекте.
Начал поочередно их исключать, потратил на это 2 часа, а утечка остаётся.
Потом вообще закомментарил все OnCreate, чтобы просто пустая форма осталась, всё равно есть утечка.
Ну, думаю, приплыли, наверное, в каком-то компоненте стороннем, но в каком?
Увидел, что указан адрес объекта в CodeGuard, поставил точку останова в деструкторе формы,
давай искать и сравнивать все адреса объектов на форме (тут я, конечно, вспоминал не злым тихим словом разрабов отладчика, которые не додумались сделать поиск или хотя бы сортировку по адресу)

В общем, несколько часов мучений не приносили мне никаких результатов.
Но тут Еврика! Я заметил, что адрес переменной, в которой происходит утечка не меняется!
Тогда я в деструкторе делаю вот такую штуку
C++
1
2
TObject *AObject = (TObject *)0x242345c;
const UnicodeString sFuckingClassName = AObject->ClassName();
И получаю его родного - источник всех бед: TIdCriticalSection

В общем, дальше уже дело техники: начал исключать все Indy классы,
все включения.
Оказалось, что включение IdStrings.hpp и использование функции StrXHtmlEncode даёт утечку.

П.С. Убрал все включения IdStrings.hpp, залез в исходники Indy, написал эту же функцию в Билдере,
абсолютно не меняя код, только переводя на С++ и утечки нет. Чудеса.
1
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.03.2013, 01:47
Цитата Сообщение от Maluda Посмотреть сообщение
Вот здесь подробно расписано, как пользоваться CodeGuard
Добавлено через 1 минуту
В частности про утечку памяти
Вот только ничего непонятно ...
Галочки в Tools > CodeGuard Configuration и Project > Options > C++ Compiler Debugging ( на скринах привел), но результата не дало..
Что еще ?

Добавлено через 1 час 4 минуты
На вкладке CodeGuard никакой инфы по утечке только строчка
28.03.2013 23:42:27 started a CodeGuard(tm) process: Project1.exe(3868)
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
29.03.2013, 13:23
Avazart, делаешь всё правильно. К сожалению нет установленного XE3, поэтому не могу сравнить. В CBuilder 2010 это работает, почему в XE3 не работает - Х.Е.З. :-)
Это стандартная Борландовская болезнь.

Единственное, что меня смущает - это почему у тебя во вкладке Enable Codeguard в свойствах проекта не активны внутренние пункты.
Вот так это выглядит в 2010
Миниатюры
Как удалять объект Graphics::TBitmap  
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.03.2013, 16:58
Почему же ? Активны.

0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
30.03.2013, 13:26
Я понял, в XE3 они по-другому расположены, на видео плохо видно было. В общем, думаю, что проблема в билдере. Кстати, попробуй создать не VCL объект, например, массив интов.
Также при использовании CodeGuard создаётся лог файл с расширением *.cgl, в котором описывается распределение памяти при работе программы. Посмотри, у тебя такой создаётся. Он обычно формируется там, где екзешник.

Пример:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Functions called:
 vsnprintf (2 times)
 memset (19 times)
 delete (1832 times)
 SysReallocMem (9783 times)
 realloc (1496 times)
 memcpy (1 times)
 SysFreeMem (50275 times)
 SysGetMem (50284 times)
 free (1464 times)
 new (1841 times)
 calloc (10 times)
 malloc (21 times)
Resource types used:
 object (1841 allocs, 896 max)
 memory block (51749 allocs, 6766 max)
Добавлено через 9 минут
В этот же файл будет записана информация о том, что объект не был правильно освобождён.

Итак, предлагаю сделать следующее исследование:
1. Закоментарить создание TBitmap
2. Запустить приложение, проверить, что сформировался *.cgl файл
3. Запомнить количество выделений и освобождений памяти
4. Раскоментировать создание TBitmap
5. Запустить проект и один раз вызвать создание TBitmap
6. Проанализировать *.cgl файл.
7. Сравнить количество выделений памяти до комментирования и после

Таким образом мы поймём, отслеживает ли вообще CodeGuard создание, и,
возможно, кто-то всё-таки освобождает память TBitmap. Он порождён от TObject,
возможно в XE3 встроен какой-нибудь сборщик мусора для VCL объектов.
1
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
31.03.2013, 01:16
Цитата Сообщение от Maluda Посмотреть сообщение
ти, попробуй создать не VCL объект, например, массив интов.
Пробовал - тот же результат.

Лог файл не нашел, опцию для него тоже не нашел ...
Цитата Сообщение от Maluda Посмотреть сообщение
Таким образом мы поймём, отслеживает ли вообще CodeGuard создание, и,
возможно, кто-то всё-таки освобождает память TBitmap. Он порождён от TObject,
возможно в XE3 встроен какой-нибудь сборщик мусора для VCL объектов.
Да исключено, Builder всегда освобождал через Owner -а, а тут его нет ...
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
01.04.2013, 00:55
Maluda,

Цитата Сообщение от Maluda Посмотреть сообщение
Итак, предлагаю сделать следующее исследование:
1. Закоментарить создание TBitmap
2. Запустить приложение, проверить, что сформировался *.cgl файл
3. Запомнить количество выделений и освобождений памяти
4. Раскоментировать создание TBitmap
5. Запустить проект и один раз вызвать создание TBitmap
6. Проанализировать *.cgl файл.
7. Сравнить количество выделений памяти до комментирования и после

Сделал. Результаты в аттаче. Разницы не видать...

P.S. У меня XE2.
Вложения
Тип файла: zip Archive.zip (2.6 Кб, 1 просмотров)
1
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
02.04.2013, 20:01
Лучший ответ Сообщение было отмечено как решение

Решение

Сейчас ещё раз внимательно перечитал документацию по CodeGuard.
Оказывается для того, чтобы отслеживать удаление VCL объектов, необходимо снимать галочку Build with runtime packages. Я просто почти всегда её снимаю, поэтому не обратил на это внимание.

В CBuilder 2010 отслеживание VCL объектов в CodeGuard происходит только, когда галочка снята. Но выделения памяти для не VCL объектов отслеживаются всегда.

Также должен быть Debug build.
3
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
02.04.2013, 20:08
Да в этом дело

Снял дополнительно еще галочку

Project Options > С++Linker > Link with Dynamiс RTL

И стал видеть утечку.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.04.2013, 20:08
Помогаю со студенческими работами здесь

TBitmap как параметр функции
void ChangeBitmapSize (TBitmap* _btm&amp;, int _newWidth, int _newHeight){ _btm-&gt;Canvas-&gt;StretchDraw(Rect(0, 0, _newWidth,...

Как повернуть TBitmap или TImage
начал делать игру на билдере и сразу появился такой вопрос)

Создание компонента,как прикрутить TBitmap->Canvas
Как можно прикрутить канву например к TPanel что бы на нем можно было рисовать как на канве TImage т.е что бы изображение не затералось? ...

Как сделать объекты TBitmap глобальными для файла?
Есть вот такая штука #include &lt;vcl.h&gt; #pragma hdrstop #include &quot;Unit4.h&quot; ...

Как получить структуру файла bmp в классе TBitmap?
Открытие файла через стандартный диалог: OpenDialog1-&gt;Execute() Изображение сохраняется как TBitmap в source: ...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
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