Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.07.2015, 14:52   #1
robix
Пользователь
 
Регистрация: 16.07.2015
Сообщений: 31
По умолчанию Не будет ли в данном случае многократное использование оператора new плохо сказываться на работе программы

Здравствуйте, хотел уточнить, не будет ли в данном случае многократное использование
оператора new плохо сказываться на работе программы.
Имеется цикл do while c частотой 10 раз в секунду.

1. Первый вариант
Bitmap * F_Bitmap;
gdiBitmapData - это ссылка на массив пикселей. Он периодически меняет значения.
Color TheColor; //Цвет
int IMAGE_W = 800; // Ширина изображения в пикселях
IMAGE_W = 600; // Высота изображения в пикселях

Код:
do
{
MyFuncUpdateArrayOfPixels(gdiBitmapData); //Моя функция устанавливающая значения пикселей
//Создаем изображение через конструктор, передавая массив пикселей gdiBitmapData
F_Bitmap = new Bitmap(800,600,stride_size,f_format,gdiBitmapData);
}
while (myexit);


Но есть способ делать так:
2. Второй вариант
Код:
do
{
MyFuncUpdateArrayOfPixels(gdiBitmapData); //Моя функция устанавливающая значения пикселей
for (x = 0; x < IMAGE_W; x++)
for (y = 0; y < IMAGE_H; y++) {
TheColor = MyFuncGetColorFromArray(gdiBitmapData,x,y); //Моя функция возвращающая цвет
F_Bitmap.SetPixel(x,y,Color); //Меняем значение пикселя у однажды созданного объекта изображения
}
}
while (myexit);

Как думаете по производительности будет ли разница меду способами 1 и 2 ?
Если постоянно делаю new Bitmap, то памяти не будет больше потребляться, чем в варианте 2 ?
Вообще после new память освобождается?
robix вне форума Ответить с цитированием
Старый 23.07.2015, 15:56   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Вообще после new память освобождается?
Ну если вы его переопределили, а так delete не зря ж есть... А по коду у вас утечка памяти.
p51x вне форума Ответить с цитированием
Старый 23.07.2015, 16:59   #3
robix
Пользователь
 
Регистрация: 16.07.2015
Сообщений: 31
По умолчанию

Спасибо, то есть получается что после
F_Bitmap = new Bitmap(800,600,stride_size,f_format ,gdiBitmapData);
память ранее выделенная под F_Bitmap остается в оперативной памяти программы и оперативная память постоянно растет?

А если я буду делать в цикле так, это нормально?
if(F_Bitmap) delete F_Bitmap;
F_Bitmap = new Bitmap(800,600,stride_size,f_format ,gdiBitmapData);

А по производительности эти два варианта как-то будут отличаться?
robix вне форума Ответить с цитированием
Старый 23.07.2015, 18:06   #4
ResourceSpace
Форумчанин
 
Аватар для ResourceSpace
 
Регистрация: 30.06.2015
Сообщений: 353
По умолчанию

На чём пишете? Что есть Bitmap? А то вот такая штука бывает: http://www.vsokovikov.narod.ru/New_M...bitmapbits.htm
ResourceSpace вне форума Ответить с цитированием
Старый 23.07.2015, 18:31   #5
jura_k
gamer
Участник клуба
 
Аватар для jura_k
 
Регистрация: 09.05.2015
Сообщений: 1,529
По умолчанию

Если есть new - должен быть delete.
Цитата:
"Если есть тьма - должен быть свет." (В. Цой)
мой канал на Ютубе: youtube.com/@games-zz3ju/videos/
мой канал на Рутубе: rutube.ru/channel/31423139/videos/
В ожидании Кеши...
jura_k вне форума Ответить с цитированием
Старый 23.07.2015, 20:04   #6
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Цитата:
Сообщение от robix Посмотреть сообщение
F_Bitmap = new Bitmap(800,600,stride_size,f_format ,gdiBitmapData);
память ранее выделенная под F_Bitmap остается в оперативной памяти программы и оперативная память постоянно растет?
F_Bitmap - это просто указатель на объект класса Bitmap, если мы его изменим, предварительно не сохранив куда-то, чтоб потом можно было освободить память через delete, то будет утечка.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Старый 23.07.2015, 21:03   #7
robix
Пользователь
 
Регистрация: 16.07.2015
Сообщений: 31
По умолчанию

Спасибо всем. Это просто для примера все.
Я понял, что если есть new, то должен быть delete.
Но использование в цикле new .... delete это не есть хороший стиль, если имеются альтернативные варианты или же это нормальная практика?

Тут суть в том, что в ЦИКЛЕ либо 1). методами класса перезаписывать массив-переменную класса, либо 2). создавать через new c предварительным delete объект класса, с передачей в него уже готового массива-переменной. Является ли вариант 2 не приемлемым? Или не хорошим стилем. Или это все мелочи, и то и то нормально?)

Последний раз редактировалось robix; 23.07.2015 в 21:06.
robix вне форума Ответить с цитированием
Старый 23.07.2015, 22:00   #8
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Если Вы просто загружаете изображение в Bitmap, то переписывать попиксельно тут не вариант (можете сами проверить, сколько по времени занимает один вариант и второй вариант). В классе Bitmap должны быть методы, которые позволяют загружать изображение целиком, не думаю, что только конструктор позволяет это сделать.

Но я так и не понял, какое отношение к этому всему имеет new и delete?
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Старый 23.07.2015, 22:18   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Но использование в цикле new .... delete это не есть хороший стиль, если имеются альтернативные варианты или же это нормальная практика?
Для одной задачи это нормальная практика, для другой нет.
Какова цель таких действий? Для чего тебе это понадобилось? Может лучше использовать какой-нибудь ImageList для кучи картинок?
Цитата:
Тут суть в том, что в ЦИКЛЕ либо
Сделай объект битмапа до цикла, и освободи после. Один единственный. И с ним работай.
А пока непонятно что тебе надо, но работа попиксельно будет медлительна.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.07.2015, 08:37   #10
jura_k
gamer
Участник клуба
 
Аватар для jura_k
 
Регистрация: 09.05.2015
Сообщений: 1,529
По умолчанию

Как только объект не нужен становится и указатель на него теряется, следует использовать delete.
Если уж совсем непонятно, можно создать "временный" указатель, копировать туда основной, а на следующей итерации цикла удалять старый объект через "временный" указатель. Но это такой способ, когда уж совсем ничего не помогает.
мой канал на Ютубе: youtube.com/@games-zz3ju/videos/
мой канал на Рутубе: rutube.ru/channel/31423139/videos/
В ожидании Кеши...
jura_k вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
нужен ли RAII в данном случае pproger Общие вопросы C/C++ 3 01.12.2012 20:15
Как работает fwrite() в данном случае ? Sergey S Общие вопросы C/C++ 2 30.05.2012 07:22
Непонятно: зачем делать декларацию функции в данном случае? Oleg_SK Общие вопросы C/C++ 0 17.07.2010 09:36
использование условного оператора в теле оператора цикла с условием машко Помощь студентам 2 21.06.2009 23:55
Delphi, рекурсия, как сделать все возможные N-ки чисел (сколько столбцов такая N-ка,в данном случае 3)? domik Помощь студентам 5 26.09.2007 16:43