Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 16.07.2015
Сообщений: 7

Стратегия выделения/освобождения памяти

16.07.2015, 22:12. Показов 3250. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
здравствуйте господа. есть такой вопрос. пусть есть класс например Bitmap - несжатое растровое изображение. Пусть необходимо уметь считывать этот bitmap из файлов различных форматов. пусть за работу с каждым форматом отвечает свой класс. например IoBmp, IoTiff, IoPng. например за считывание битмапа из IoBmp отвечает какой-нибудь статический метод IoBmp::open(const std::string &fileName). вопрос как бы поудобнее это дело организовать. именно, если сделать так:
C++
1
2
3
4
static Bitmap IoBmp::open(/*...*/) {
    //...
    return Bitmap(/*...*/);
}
битмап нельзя будет считать в кучу (Bitmap* bmp = new Bitmap(IoBmp::open(...)) не в счет - не хочется копировать растр. хотя?...). если
C++
1
2
3
4
static Bitmap* IoBmp::open(/*...*/) {
    //...
    return new Bitmap(/*...*/);
}
память под битмап будет динамически выделена внутри этого open и удалить мы его вообще говоря не сможем. конечно, delete bmp; вне метода open сработает, но так делать нельзя.
так и тянет написать что-то вроде
C++
1
2
3
void Bitmap::free() {
    delete this;
}
чтоб получилось
C++
1
2
Bitmap* bmp = IoBmp::open(fileName); //IoBmp знает как выделена память
bmp->free(); //Bitmap знает как ее освободить. внешней программе пофиг,но все равно нехорошо как-то
можно ли так делать?
или так?
C++
1
2
3
4
5
static void IoBmp::free(Bitmap* bmp) {
    delete bmp;
}
Bitmap* bmp = IoBmp::open(fileName);
IoBmp::free(bmp);
ну и как вариант сделать что-то вроде того:
C++
1
2
3
4
5
static size_t IoBmp::getSize(const std::string &fileName);
static void IoBmp::open(Bitmap* bmp, const std::string &fileName);
Bitmap* bmp = new Bitmap(IoBmp::getSize(fileName)); //выделяем память под битмап по данным из файла
IoBmp::open(bmp, fileName); //читаем из файла растр
delete bmp;
и все довольны. но как-то куцо и неудобно выходит. чего-то я вообще не знаю как поступить. вопрос наверно бредовый, но уж помогите)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.07.2015, 22:12
Ответы с готовыми решениями:

Нюансы выделения и освобождения памяти (структуры)
struct point { int a; point *next; } point *p=new point Я освобожу всю память которая отводилась под динам. структуру? delete...

Функциии динамического выделения и освобождения памяти
Необходим написать функции выделения и освобождения памяти под двумерный динамический массив. Причем освобождение должн быть не сразу для...

Написать функции для работы с массивом - выделения/освобождения памяти, консольного ввода/вывода
Напишите функции: 1) выделяющую память для массива данных типа float, 2) заполняющую ячейки данными с клавиатуры, 3) выводящую...

23
0 / 0 / 0
Регистрация: 16.07.2015
Сообщений: 7
17.07.2015, 17:57  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от hoggy Посмотреть сообщение
если после прочтения этого абзаца вам не понятно
ну да, пока не совсем.. этот ресурс может понадобиться кому-то позже? но пример такой ситуации в голову не приходит. надеюсь что
Цитата Сообщение от hoggy Посмотреть сообщение
все поймете позже
0
76 / 76 / 32
Регистрация: 14.04.2014
Сообщений: 408
17.07.2015, 18:23
Цитата Сообщение от hoggy Посмотреть сообщение
рецепт, как изготовить сишный говнокод?
кто мешает внутри фабрики сделать список всех созданных обьектов? фабрика часто строится по паттарнеу одиночка, поэтому с удалением фабрики скорее всего и вся часть системы работавшая с обьектами тоже удалится

Добавлено через 7 минут
Прошу прощения, внимательно посмотрел код примера и увидел, что так и сделано.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
17.07.2015, 19:37
просто_спросить, make_shared использовать лучше. Конструктор shared_ptr был изначально, а учитывая, что раньше не было variadic templates, а boost::make_shared не умел принимать больше 9-10 аргументов (да, это не лучший стиль, но иногда бывает нужно), то использовался конструктор. make_shared безопаснее потому что делает все в себе, а быстрее потому что сует счетчик и созданный объект в одну область динамической памяти, в то время как в конструктор мы уже подаем созданный указатель, поэтому счетчик находится в другой области памяти.
Тут описано лучше, при нормальном знании английского советую почитать: http://stackoverflow.com/quest... d-ptr-in-c
2
0 / 0 / 0
Регистрация: 16.07.2015
Сообщений: 7
17.07.2015, 20:45  [ТС]
угу,там упоминаются ситуации,когда следует использовать конструктор. правда про custom deleter никаких объяснений, но надо будет поподробнее об этом почитать. а так все сводится к вашему ответу о том,что с конструктором имеем две независимые области,а с make_shared одну общую.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.07.2015, 20:45
Помогаю со студенческими работами здесь

С++ Проверка освобождения памяти
Добрый день. На начальном курсе С++ получил такую задачу: Написать функцию, которая получает массив строк и его размер, и...

Указатель после освобождения памяти
Стивен Прата, глава 4, раздел "Освобождение памяти с помощью операции delete" Я пытаюсь понять. Написал: #include...

Деструкторы, аналоги освобождения памяти
Доброго времени суток. Возник следующий вопрос. Какие, помимо деструкторов, способы очистки памяти существуют. Спасибо за уделенное...

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

Ошибка освобождения памяти new/delete
При выполнении оператора deleterez вылетает ошибка BLOCK_TYPE_IS_VALID(pHead->nBlockUse) #include <iostream> using...


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

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru