Форум программистов, компьютерный форум, киберфорум
C++/CLI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
128 / 86 / 10
Регистрация: 03.02.2011
Сообщений: 477
1

Не получается сделать грамотное удаление Bitmap (освободить ресурсы)

27.06.2013, 10:22. Показов 2366. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Ситуация следующая, есть Bitmap, большого размера, по нажатию кнопки он перегенерируется исходя из данных.
C++
1
2
3
Bitmap ^bmRastr = gcnew Bitmap(num,num);
идет заполнение битмапа
pictureBox1->Image=bmRastr;
и тут он мне больше не нужен, до следующего нажатия кнопки.
Если ничего не писать больше, то при каждом нажатии кнопки размер программы будет увеличиваться, можно так всю оперативку забить. Можно конечно объявить этот битмап глобально, один раз, при загрузке формы создать его, а потом только перерисовывать. Но это, к сожалению не вариант.
Пытался его удалить, после присвоения pictureBox1->Image значения bmRastr, через
C++
1
2
3
delete[] bmRastr;
//или
delete bmRastr;
Эффект одинаковый, pictureBox становится белым с красным крестом по центру (перечеркнутый), логично, удаляю объект.
сейчас делаю через
C++
1
GC::Collect();
Ресурсы очищаются, но как-то я не уверен в правильности. Хочется всё таки удалять именно тот объект, который создал. Как мне сделать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.06.2013, 10:22
Ответы с готовыми решениями:

Освободить ресурсы от рисунка
После загрузки из файла в picbox. Файл нельзя перезаписать , так как рисунок занят и выдает ошибку....

Освободить ресурсы BitmapImage
Здравствуйте! На WPF окно загружаю картинку из файла с помощью класса BitmapImage. Перед открытием...

Как освободить ресурсы в потоке?
Добрый вече прошу помощи по следующему вопросу проблеме. Есть пул потоков, один на все приложение....

Освободить ресурсы для повторного запроса
часть которая мозги....промывает. суть: при отркрытии формы в dblookupcombo выбираются значения....

13
753 / 552 / 48
Регистрация: 17.06.2010
Сообщений: 1,041
Записей в блоге: 1
01.07.2013, 16:34 2
Цитата Сообщение от KokosSPb Посмотреть сообщение
Эффект одинаковый, pictureBox становится белым с красным крестом по центру (перечеркнутый), логично, удаляю объект
Мне кажется нужно добавить после освобождения памяти (delete)
C++
1
pictureBox1->Image=nullptr;
0
128 / 86 / 10
Регистрация: 03.02.2011
Сообщений: 477
01.07.2013, 17:35  [ТС] 3
мне, к сожалению, нужно, чтоб картинка сохранилась в pictureBox
0
753 / 552 / 48
Регистрация: 17.06.2010
Сообщений: 1,041
Записей в блоге: 1
02.07.2013, 08:59 4
KokosSPb, минуточку. если он нужен в пикчере, тогда зачем его убивать. убивая его, свойство Image потеряет ссылку на bitmap. отсюда и красный крест
0
128 / 86 / 10
Регистрация: 03.02.2011
Сообщений: 477
02.07.2013, 09:25  [ТС] 5
Это я тоже понимаю
Цитата Сообщение от KokosSPb Посмотреть сообщение
с красным крестом по центру (перечеркнутый), логично, удаляю объект
, но если я еще раз нажму на эту кнопку, он снова пересоздаст объект, без удаления старого, да и ссылки на старый объект Bitmap не получить, его надо тогда объявлять в куче, как мне сделать так, чтоб он не забивал оперативку целиком? Если создать PictureBox->Image через FromImage, а потом удалить файл с картинкой, то в программе картинка останется, вот и я хочу, чтоб она осталась в свойстве Image
0
753 / 552 / 48
Регистрация: 17.06.2010
Сообщений: 1,041
Записей в блоге: 1
02.07.2013, 09:38 6
область видимости битмапа какая?

Добавлено через 3 минуты
и почему нельзя делать очистку непосредственно перед новым наполнением?
0
128 / 86 / 10
Регистрация: 03.02.2011
Сообщений: 477
02.07.2013, 09:38  [ТС] 7
да я понимаю, что отсюда и красный крест, я так и в самом посте пишу, но, представь, что это картинка 7000*7000 пикселей, я нажал кнопку, она сформировалась, потом я нажимаю еще раз нажал кнопку, она снова сформировалась, и так много-много раз, и каждый раз программа в оперативке будет увеличиваться
0
753 / 552 / 48
Регистрация: 17.06.2010
Сообщений: 1,041
Записей в блоге: 1
02.07.2013, 09:41 8
C++
1
2
3
4
5
6
//перед новым наполнением
if (bmRastr !=nullptr)
{
bmRastr->Dispose();
}
// новое наполнение
0
128 / 86 / 10
Регистрация: 03.02.2011
Сообщений: 477
02.07.2013, 09:43  [ТС] 9
Цитата Сообщение от gitarillo Посмотреть сообщение
Код C++1
2
3
4
5
6
//перед новым наполнением
if (bmRastr !=nullptr)
{
bmRastr->Dispose();
}
// новое наполнение
Цитата Сообщение от KokosSPb Посмотреть сообщение
Bitmap ^bmRastr = gcnew Bitmap(num,num);
идет заполнение битмапа
pictureBox1->Image=bmRastr;
область видимости битмапа - функция события нажатия кнопки
0
753 / 552 / 48
Регистрация: 17.06.2010
Сообщений: 1,041
Записей в блоге: 1
02.07.2013, 09:51 10
ну тогда перед новым созданием битмапа Image пикчера установите в null, и сборка мусора должна произойти автоматом, так как на объект битмапа не останется ни одной ссылки
1
128 / 86 / 10
Регистрация: 03.02.2011
Сообщений: 477
02.07.2013, 10:02  [ТС] 11
всё равно размер программы растет
C++
1
2
pictureBox1->Image = nullptr;
Bitmap ^bmRastr = gcnew Bitmap(num,num);
так ведь надо было написать?
0
753 / 552 / 48
Регистрация: 17.06.2010
Сообщений: 1,041
Записей в блоге: 1
02.07.2013, 10:08 12
Цитата Сообщение от KokosSPb Посмотреть сообщение
так ведь надо было написать?
ну да. а сильно растет? и вы уверены, что из-за этого? а если 100 раз пересоздать изображение?
0
128 / 86 / 10
Регистрация: 03.02.2011
Сообщений: 477
02.07.2013, 10:11  [ТС] 13
ну, раз 25 пересоздал, сильно растет, с 12 до 50 метров
0
753 / 552 / 48
Регистрация: 17.06.2010
Сообщений: 1,041
Записей в блоге: 1
02.07.2013, 10:12 14
ну тогда раз принудительная сборка помогает, тогда ее и используйте
1
02.07.2013, 10:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.07.2013, 10:12
Помогаю со студенческими работами здесь

Как засунуть bitmap в ресурсы?
Как засунуть bitmap в ресурсы?

Не получается освободить память
Здравствуйте, такая загвоздка, начал изучать указатели и создание динамических массивов, проблема в...

Не получается освободить память динамического двумерного массива
Пишу в Visual Studio 2015 Community Объявляю двумерный динамический массив так: int **mas =...

Почему не получается освободить память, выделенную для переменных в структуре?
не получается освободить память, выделенную для переменных в структуре. Помогите пожалуйста, код...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru