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

C++

Войти
Регистрация
Восстановить пароль
 
insideone
Модератор
Автор FAQ
3635 / 913 / 48
Регистрация: 10.01.2010
Сообщений: 2,460
#1

Свободна ли память? - C++

03.06.2010, 08:56. Просмотров 870. Ответов 11
Метки нет (Все метки)

Существует ли способ определить на что указывает указатель - мусор (свободная память) или занятая память?
C++
1
2
3
4
5
int* a = new int;
*a = 3;
delete a;
if ( check(a) ) // ???
*a = 6;
Пример натянутый конечно, на деле - объекты имеют указатели на ресурсы, которые по разным причинам могут быть потеряны вне их контроля. Если ресурс был потерян объектом, нужно вновь вызвать функцию загрузки. Конечно это все можно контролировать "над" объектом, но вдруг можно сделать все проще :-))
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.06.2010, 08:56     Свободна ли память?
Посмотрите здесь:

C++ Динамическая память
Вроде бы память... C++ Linux
C++ Динамическая память
C++ Освобождается ли память?
C++ Builder Память
C++ Память
Динамическая память C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CheshireCat
Эксперт С++
2891 / 1240 / 78
Регистрация: 27.05.2008
Сообщений: 3,327
03.06.2010, 11:52     Свободна ли память? #2
Нет.
Существует только одно предопределенное значение - NULL. Только NULL-указатель гарантированно не указывает ни на какой объект.
insideone
Модератор
Автор FAQ
3635 / 913 / 48
Регистрация: 10.01.2010
Сообщений: 2,460
03.06.2010, 14:07  [ТС]     Свободна ли память? #3
Ну почему же, допустим если самому контролировать выделения памяти то можно записывать какие участки заняты и потом проверять. По сути Windows имеет такие таблицы, тогда может средствами WinAPI?
CheshireCat
Эксперт С++
2891 / 1240 / 78
Регистрация: 27.05.2008
Сообщений: 3,327
03.06.2010, 14:13     Свободна ли память? #4
Если самому контролировать выделения памяти - то чем это отличается от "это все можно контролировать "над" объектом" ? В чем упрощение?
А что касается подхода собственно Windows и WinAPI, то выделение и удаление памяти осуществляет CRT - C Run-Time Library, и сама Windows к этому процессу не имеет отношения. Функции WinAPI типа VirtualAlloc() передают виртуальную память очень большими "кусками" менеджеру памяти СRT, который уже "нарезает" ее на мелкие кусочки нужного размера и распределяет их объектам.
Evg
Эксперт CАвтор FAQ
17299 / 5547 / 347
Регистрация: 30.03.2009
Сообщений: 15,101
Записей в блоге: 26
03.06.2010, 14:18     Свободна ли память? #5
Цитата Сообщение от insideone Посмотреть сообщение
Ну почему же, допустим если самому контролировать выделения памяти то можно записывать какие участки заняты и потом проверять
Проверяй. При условии, что АБСОЛЮТНО ВСЕ обращения в память пройдут через твои руки. Что нереально.

Цитата Сообщение от insideone Посмотреть сообщение
По сути Windows имеет такие таблицы, тогда может средствами WinAPI?
Операционная система имеет лишь описание страниц, замапированных для данного процесса. Что по ним записано - это просто технически нельзя определить.

Эта проблема встала уже очень давно и многие компании пытались её решить через всяческие тэгированные и дескрипторные архитектуры. Многие из этих архитектур были созданы (либо на бумаге, либо в виде реального железа), по ним защитили множество кандидатских и докторских, после чего успешно всё отправлено на свалку. Как минимум потому, что очень много реального софта в процессе работы обращаются к неинициализированным участкам данных или некорректноработают с указателями, но это фатальным не является (типа прочитали неинициализировнное значение, но не использовали).
Manjak
269 / 175 / 7
Регистрация: 12.03.2010
Сообщений: 494
03.06.2010, 14:18     Свободна ли память? #6
Напрямую, по моему, никак не выйдет. Можно конечно извращаться и например следить за этим блоком памяти(а там уже решать используется ли память или про нее забыли, я бы такое не писал) на предмет записи и тд, но это будет код, чтобы побаловаться да и только
Evg
Эксперт CАвтор FAQ
17299 / 5547 / 347
Регистрация: 30.03.2009
Сообщений: 15,101
Записей в блоге: 26
03.06.2010, 15:03     Свободна ли память? #7
Хотя что-то я загнул. Речь идёт не об инициализированных данных, а о выделенной и невыделенной памяти. Проблема решается тем, что ты пишешь свой собственный менеджер памяти и ВСЕ вызовы по выделению памяти заруливаешь на свой менеджер. Я не помню, как это правильно сделать по синтаксису, но Си++ повзволяет в new указать конкретную память. Только фо факту это оченб быстро надоест, потому как если где-то забудешь и память выделишь любым другим способом - то у тебя всё накроется медным тазом
CheshireCat
Эксперт С++
2891 / 1240 / 78
Регистрация: 27.05.2008
Сообщений: 3,327
03.06.2010, 15:10     Свободна ли память? #8
На самом деле, могу дать коллеге insideone полезный совет - использовать идиому "умных указателей" (которая уже официально войдет в Стандарт C++11, а неофициально уже поддерживается std::tr1) и не ломать голову над этой проблемой.
Поверь, в разработке ПО есть гораздо более существенные проблемы, над которыми действительно стоит ломать голову и тратить время, чем рутинное управление памятью ....
Manjak
269 / 175 / 7
Регистрация: 12.03.2010
Сообщений: 494
03.06.2010, 15:20     Свободна ли память? #9
Я тут пошевелил опилками... если нужно выделить память именно в этот блоке то пробуем выделить. Если занято - смещаемся до свободного места и там выделяем.
easybudda
Эксперт С++
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
03.06.2010, 15:20     Свободна ли память? #10
Ещё хорошей привычкой было бы сразу после
delete some_pointer;
дописывать
some_pointer = NULL;
Manjak
269 / 175 / 7
Регистрация: 12.03.2010
Сообщений: 494
03.06.2010, 15:26     Свободна ли память? #11
Можно память вообще не декомитить, а держать про запас

ПС. "Я не жадный, я домовитый"
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.06.2010, 20:05     Свободна ли память?
Еще ссылки по теме:

C++ Динамическая память [new]
Разделяемая память C++
Память C++ WinAPI
Оперативная память (СИ/СИ++) C++
Освободится ли память? C++

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

Или воспользуйтесь поиском по форуму:
insideone
Модератор
Автор FAQ
3635 / 913 / 48
Регистрация: 10.01.2010
Сообщений: 2,460
03.06.2010, 20:05  [ТС]     Свободна ли память? #12
Цитата Сообщение от CheshireCat Посмотреть сообщение
использовать идиому "умных указателей" (которая уже официально войдет в Стандарт C++11, а неофициально уже поддерживается std::tr1)
Спасибо Уж и раньше читал, но видимо не внимательно, сейчас присмотрелся по лучше

Вообще на самом деле вопрос у меня встал не критичный, просто DirectX при Alt-TAB из полноэкранного приложения некоторые свои COM ресурсы освобождает (а выделял то я) они становятся битые... тут пожалуй и умные указатели не помогут
Yandex
Объявления
03.06.2010, 20:05     Свободна ли память?
Ответ Создать тему
Опции темы

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