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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
Lifebinder
6 / 6 / 0
Регистрация: 04.10.2009
Сообщений: 100
#1

Out of memory - C++

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

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

По таймеру каждые 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
Посмотрите здесь:

memory can't be 'written' - C++
Помогите найти ошибку. При компиле ничего не выскакивает. Когда запускаю программу - ошибка. Программа-переводчик из двоичной системы...

Memory Bomb - C++
помогите пожалуйста решить лабораторную работу))))заранее спасибо) Напишите программу, которая выделяет 200 раз по 200 мегабайт (память...

Memory Manager - C++
Добрый день, после прочтения темы http://www.cyberforum.ru/cpp-beginners/thread1399246.html заинтересовался: стоит ли писать такой...

vector memory - C++
#include "stdafx.h" #include <iostream> using namespace std; template <typename T> class vector { T* m_arr; int...

memory leaks | Деструктор - C++
#ifndef INTEG_H_ #define INTEG_H_ #include <iostream> using namespace std; class integer{ private: int value; int...

Custom memory manager - C++
в образовательных целях решил написать свой менеджер памяти class memory_pool { typedef unsigned char byte; struct free_space...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
BornLeader
50 / 46 / 1
Регистрация: 16.05.2008
Сообщений: 162
28.04.2010, 17:34     Out of memory #2
приведи больше кода. Ты память хоть освобождаешь?
Lifebinder
6 / 6 / 0
Регистрация: 04.10.2009
Сообщений: 100
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
6 / 6 / 0
Регистрация: 04.10.2009
Сообщений: 100
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
6 / 6 / 0
Регистрация: 04.10.2009
Сообщений: 100
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
Ушёл с форума.
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
Ушёл с форума.
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
6 / 6 / 0
Регистрация: 04.10.2009
Сообщений: 100
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
6 / 6 / 0
Регистрация: 04.10.2009
Сообщений: 100
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
Еще ссылки по теме:

Unable to read memory - C++
Явных ошибок нет, а в чем проблема понять не могу. Буду премного благодарен за разъяснение.

Ошибка bad_alloc at memory location - C++
Мне нужно создать метод для обработки массива. И в методе мне нужно создать динамический массив типа дабл. Когда я компилирию код...

Memory pool and sizeof(string) - C++
хочу написать класс, который выделяет куски памяти(например по 1000 байт), и раздает указатели на память class memory_pool { typedef...

COM-объект..клиент-сервер..shared memory - 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
Ответ Создать тему
Опции темы

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