Форум программистов, компьютерный форум CyberForum.ru

Out of memory - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
Lifebinder
 Аватар для Lifebinder
6 / 6 / 0
Регистрация: 04.10.2009
Сообщений: 96
28.04.2010, 16:58     Out of memory #1
Недавно решил освоить графику в с++, и при прорисовке изображения на канве заметил, что оно занимает память.

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

Пытался через
imgMain->Canvas->Refresh();
imgMain->Canvas->FillRect(imgMain->Canvas->ClipRect);
Последнюю нашел в инете.. в общем ничего не помогает.
Миниатюры
Out of memory  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.04.2010, 16:58     Out of memory
Посмотрите здесь:

C++ Memory Bomb
memory can't be 'written' C++
C++ memory leaks | Деструктор
Unable to read memory C++
vector memory C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
BornLeader
50 / 46 / 1
Регистрация: 16.05.2008
Сообщений: 162
28.04.2010, 17:34     Out of memory #2
приведи больше кода. Ты память хоть освобождаешь?
Lifebinder
 Аватар для Lifebinder
6 / 6 / 0
Регистрация: 04.10.2009
Сообщений: 96
28.04.2010, 17:41  [ТС]     Out of memory #3
Ты память хоть освобождаешь?
Я это от вас и хочу узнать
как ее освободить
BornLeader
50 / 46 / 1
Регистрация: 16.05.2008
Сообщений: 162
28.04.2010, 18:16     Out of memory #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;
Lifebinder
 Аватар для Lifebinder
6 / 6 / 0
Регистрация: 04.10.2009
Сообщений: 96
28.04.2010, 22:35  [ТС]     Out of memory #5
ну ладно.. придется исправлять все) только вопросик один..
если теперь придется рисовать на канве так :
C++
1
Form1->Canvas->Brush->Bitmap = Bmp.get();
А как тут координаты задать? вот например как здесь:
C++
1
Form1->Canvas->Draw(20,20, bmp);
BornLeader
50 / 46 / 1
Регистрация: 16.05.2008
Сообщений: 162
29.04.2010, 10:17     Out of memory #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;

Lifebinder
 Аватар для Lifebinder
6 / 6 / 0
Регистрация: 04.10.2009
Сообщений: 96
29.04.2010, 12:29  [ТС]     Out of memory #7
в чем ошибка?
C++
1
std::auto_ptr<Graphics::TBitmap> bm[i](new Graphics::TBitmap);
BornLeader
50 / 46 / 1
Регистрация: 16.05.2008
Сообщений: 162
29.04.2010, 12:46     Out of memory #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];
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
29.04.2010, 12:49     Out of memory #9
Цитата Сообщение от BornLeader Посмотреть сообщение
C++
1
Form1->Canvas->Brush->Bitmap = NULL;
. Ну и ну. Вместо освобождения забыть, где выделял.
C++
1
delete Form1->Canvas->Brush->Bitmap;
BornLeader
50 / 46 / 1
Регистрация: 16.05.2008
Сообщений: 162
29.04.2010, 13:02     Out of memory #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 Посмотреть сообщение
забыть, где выделял.
а обнуление указателя, к Вашему удовольствию
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
29.04.2010, 13:19     Out of memory #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 минуту
Сюда глянь.
Lifebinder
 Аватар для Lifebinder
6 / 6 / 0
Регистрация: 04.10.2009
Сообщений: 96
29.04.2010, 13:43  [ТС]     Out of memory #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 получается, с чего начали к тому и пришли
BornLeader
50 / 46 / 1
Регистрация: 16.05.2008
Сообщений: 162
29.04.2010, 14:25     Out of memory #13
Цитата Сообщение от Lifebinder Посмотреть сообщение
Дак это же опять обычный bitmap получается, с чего начали к тому и пришли
Да вот представьте себе

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

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

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

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

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

Да и ваши примеры относятся не к нашей ситуации
Я предположения сделал, и чуть-чуть доверился примерам в интернете, которые искал с целью
решить свою проблему. Я не знал как освободить этот буфер памяти, и в интернете ничего дельного не было,
я стал тыкать пальцем в небо. Авось получится, теперь вот обратился к вам за помощью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.04.2010, 18:28     Out of memory
Еще ссылки по теме:

C++ Memory pool and sizeof(string)
C++ Custom memory manager
Memory Manager C++

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

Или воспользуйтесь поиском по форуму:
BornLeader
50 / 46 / 1
Регистрация: 16.05.2008
Сообщений: 162
29.04.2010, 18:28     Out of memory #15
Цитата Сообщение от Lifebinder Посмотреть сообщение
Цитата Сообщение от BornLeader Посмотреть сообщение А за создаваемый объект обернутый в std::auto_ptr можно вообще забыть, по причинам выше описанным. Зачем тогда было морочить голову им
Ну голову никто не морочит, просто в приведеном мною примере я создаю TBitmap и и для освобождения памяти использовал данный способ.


Цитата Сообщение от Lifebinder Посмотреть сообщение
Напиши код, а то ты одно пишешь, taras atavin другое пишет.
ну тут могу только посоветовать справку по компоненту почитать или в исходники vcl заглянуть
Yandex
Объявления
29.04.2010, 18:28     Out of memory
Ответ Создать тему
Опции темы

Текущее время: 16:52. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru