Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/10: Рейтинг темы: голосов - 10, средняя оценка - 4.50
9 / 9 / 2
Регистрация: 04.10.2009
Сообщений: 111
1

Out of memory

28.04.2010, 16:58. Просмотров 2095. Ответов 14
Метки нет (Все метки)

Недавно решил освоить графику в с++, и при прорисовке изображения на канве заметил, что оно занимает память.

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

Пытался через
imgMain->Canvas->Refresh();
imgMain->Canvas->FillRect(imgMain->Canvas->ClipRect);
Последнюю нашел в инете.. в общем ничего не помогает.
0
Миниатюры
Out of memory  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.04.2010, 16:58
Ответы с готовыми решениями:

Create an in memory bitmap and draw directly to the memory
Здравствуйте! У меня есть пара вопросов. Знаю, что рисовать в HDC можно только с одного потока. Но...

Out of memory
Всем привет. У меня есть две матрицы размеров 306000 на 14000. Мне нужно поэлементно разделить их...

Out of memory
После добавления очередной формы в проект при попытке его сохранить возникает ошибка Out Of Memory...

Out of memory
то ли я чего то не понимаю, то ли что... весит папка с приложением 4,1мб. собирается под...

14
53 / 49 / 9
Регистрация: 16.05.2008
Сообщений: 162
28.04.2010, 17:34 2
приведи больше кода. Ты память хоть освобождаешь?
0
9 / 9 / 2
Регистрация: 04.10.2009
Сообщений: 111
28.04.2010, 17:41  [ТС] 3
Ты память хоть освобождаешь?
Я это от вас и хочу узнать
как ее освободить
0
53 / 49 / 9
Регистрация: 16.05.2008
Сообщений: 162
28.04.2010, 18:16 4
C++
1
2
3
4
5
6
    std::auto_ptr<Graphics::TBitmap> Bmp(new Graphics::TBitmap);
    Bmp->LoadFromFile("./1bmp.bmp");
 
    Form1->Canvas->Brush->Bitmap = Bmp.get();
    Form1->Canvas->FillRect(Form1->Canvas->ClipRect);
    Form1->Canvas->Brush->Bitmap = NULL;
0
9 / 9 / 2
Регистрация: 04.10.2009
Сообщений: 111
28.04.2010, 22:35  [ТС] 5
ну ладно.. придется исправлять все) только вопросик один..
если теперь придется рисовать на канве так :
C++
1
Form1->Canvas->Brush->Bitmap = Bmp.get();
А как тут координаты задать? вот например как здесь:
C++
1
Form1->Canvas->Draw(20,20, bmp);
0
53 / 49 / 9
Регистрация: 16.05.2008
Сообщений: 162
29.04.2010, 10:17 6
C++
1
2
3
4
5
6
  std::auto_ptr<Graphics::TBitmap>  Bmp(new  Graphics::TBitmap); 
  Bmp->LoadFromFile("./1bmp.bmp");      
 
  Form1->Canvas->Brush->Bitmap = Bmp.get();    
  Form1->Canvas->FillRect(Rect(0,0,100,100)); 
  Form1->Canvas->Brush->Bitmap = NULL;

1
9 / 9 / 2
Регистрация: 04.10.2009
Сообщений: 111
29.04.2010, 12:29  [ТС] 7
в чем ошибка?
C++
1
std::auto_ptr<Graphics::TBitmap> bm[i](new Graphics::TBitmap);
0
53 / 49 / 9
Регистрация: 16.05.2008
Сообщений: 162
29.04.2010, 12:46 8
да ошибка в том что ты пытаешься работать с массивом std::auto_ptr

тут надо работать без него
C++
1
2
3
4
5
6
7
8
9
10
11
// Инициализация массива
const int size = 10;
Graphics::TBitmap* bm[size];
 
// создание объектов
for(int i=0;i<size;i++)
  bm[i] = new Graphics::TBitmap;
 
// удаление объектов
for(int i=0;i<size;i++)
 delete bm[i];
0
4196 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
29.04.2010, 12:49 9
Цитата Сообщение от BornLeader Посмотреть сообщение
C++
1
Form1->Canvas->Brush->Bitmap = NULL;
. Ну и ну. Вместо освобождения забыть, где выделял.
C++
1
delete Form1->Canvas->Brush->Bitmap;
0
53 / 49 / 9
Регистрация: 16.05.2008
Сообщений: 162
29.04.2010, 13:02 10
Цитата Сообщение от taras atavin Посмотреть сообщение
Ну и ну. Вместо освобождения забыть, где выделял. Код C++ 1 delete Form1->Canvas->Brush->Bitmap;
ну ну

Цитата Сообщение от BornLeader Посмотреть сообщение
std::auto_ptr Bmp(new Graphics::TBitmap);
вот это и есть создание объекта обернутого в автопоинтер, а если Вы не знаете что это такое то уж извените. В нем автоматически вызывается удаление объекта (delete)
RTFM пожалуйста

Добавлено через 1 минуту
Цитата Сообщение от taras atavin Посмотреть сообщение
Цитата Сообщение от BornLeader Посмотреть сообщение Код C++ 1 Form1->Canvas->Brush->Bitmap = NULL;
это не

Цитата Сообщение от taras atavin Посмотреть сообщение
забыть, где выделял.
а обнуление указателя, к Вашему удовольствию
0
4196 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
29.04.2010, 13:19 11
Вот именно. Обнуление указателя, а не особождение памяти по нему, то есть приказ приладе, но не системе, забыть о том, что память была выделена и куда именно.
Так будет работать:
C++
1
2
3
4
5
6
7
double *a,*b;
a=new double;
b=a;
*b=2..0;
b=NULL;
*a=*a*2;
cout<<*a;
(выведет 4), а так не работает:
C++
1
2
3
4
5
6
7
double *a,*b;
a=new double;
b=a;
*b=a;
delete b;
*a=*a*2;
cout<<*a;
Добавлено через 11 минут
Кстати, я уже 15 лет пишу проги, имею степень к.т.н. по специальности 05.13.18. Поинтересуйся на досуге, что это за код.

Добавлено через 1 минуту
Сюда глянь.
0
9 / 9 / 2
Регистрация: 04.10.2009
Сообщений: 111
29.04.2010, 13:43  [ТС] 12
Цитата Сообщение от BornLeader Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
// Инициализация массива
const int size = 10;
Graphics::TBitmap* bm[size];
 
// создание объектов
for(int i=0;i<size;i++)
  bm[i] = new Graphics::TBitmap;
 
// удаление объектов
for(int i=0;i<size;i++)
 delete bm[i];
Дак это же опять обычный bitmap получается, с чего начали к тому и пришли
0
53 / 49 / 9
Регистрация: 16.05.2008
Сообщений: 162
29.04.2010, 14:25 13
Цитата Сообщение от Lifebinder Посмотреть сообщение
Дак это же опять обычный bitmap получается, с чего начали к тому и пришли
Да вот представьте себе

Добавлено через 8 минут
Замечу Вам уважаемый Lifebinder,
что TCanvas это property класса TForm, и именно обнуление было необходимо в данной ситуации, чтобы освободить его буффер памяти.

А за создаваемый объект обернутый в
std::auto_ptr можно вообще забыть, по причинам выше описанным.

Вы наверно Lifebinder явно не на Builder пишите

Добавлено через 2 минуты
Да и ваши примеры относятся не к нашей ситуации
0
9 / 9 / 2
Регистрация: 04.10.2009
Сообщений: 111
29.04.2010, 17:57  [ТС] 14
Цитата Сообщение от BornLeader Посмотреть сообщение
А за создаваемый объект обернутый в
std::auto_ptr можно вообще забыть, по причинам выше описанным.
Зачем тогда было морочить голову им?

именно обнуление было необходимо в данной ситуации
Напиши код, а то ты одно пишешь, taras atavin другое пишет. Дискуссию устроили.

Да и ваши примеры относятся не к нашей ситуации
Я предположения сделал, и чуть-чуть доверился примерам в интернете, которые искал с целью
решить свою проблему. Я не знал как освободить этот буфер памяти, и в интернете ничего дельного не было,
я стал тыкать пальцем в небо. Авось получится, теперь вот обратился к вам за помощью.
0
53 / 49 / 9
Регистрация: 16.05.2008
Сообщений: 162
29.04.2010, 18:28 15
Цитата Сообщение от Lifebinder Посмотреть сообщение
Цитата Сообщение от BornLeader Посмотреть сообщение А за создаваемый объект обернутый в std::auto_ptr можно вообще забыть, по причинам выше описанным. Зачем тогда было морочить голову им
Ну голову никто не морочит, просто в приведеном мною примере я создаю TBitmap и и для освобождения памяти использовал данный способ.


Цитата Сообщение от Lifebinder Посмотреть сообщение
Напиши код, а то ты одно пишешь, taras atavin другое пишет.
ну тут могу только посоветовать справку по компоненту почитать или в исходники vcl заглянуть
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.04.2010, 18:28

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Out of memory
прога использует AlphaControls. при линковке выпадает оут оф мемори.

Out of memory
Приветствую уважаемые! Изучаю ассемблер по учебнику &quot;Ассемблер - это просто&quot;. Дошел до создания...

Out of memory
Не подскажите из-за чего здесь может возникать Out of memory? v2 и r2 - динамические массивы. ...

Out of memory imageLoader
Добрый день. Проблема такая, есть таск, загружающий некую информацию и там же imageLoader....


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.