Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

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

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

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

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

Статическая память,Динамическая память. - C++
a) Статическая память. Двумерный массив. Дан массив целых чисел. В массиве есть отрицательные числа. Определить координаты левого нижнего...

Realloc выделяет память для массива int и не выделяет память для массива double - C++
Скажите пожалуйста, почему вот этот код работает: #include <iostream> #include <windows.h> using namespace std; int main()...

Вероятность того, что в библиотеке книга свободна, равна 0,35 - Теория вероятностей
Вероятность того, что в библиотеке необходимая студентке книга свободна равна 0,35. Определить вероятность того, что: а) студентке...

Дорожка разделена на клетки. Для каждой клетки указано, свободна ли она. Можно ли замостить дорогу плиткой 1x2 - PascalABC.NET
Моих знаний хватило только на то чтобы заполнить единицами и нулями динамичный массив с этими размерами, можете помочь с алгоритмом...

Когда ставишь память в DIMM2, при этом приходится память переворачивать - Оперативная память
Помогите мне. При добавление памяти в столкнулся с проблемой. Когда память стоит в DIMM1 (фото 1) всё работает хорошо. Когда ставишь эту...

Разделяемая память POSIX IPC как узнать, что память выделена и её уже можо использовать? - C Linux
1. Описание проблемы: Две программы. Одна пишет в разделяемую память, другая читает. Из-под читающей программы read невозможно понять...

11
CheshireCat
Эксперт С++
2903 / 1252 / 81
Регистрация: 27.05.2008
Сообщений: 3,436
03.06.2010, 11:52 #2
Нет.
Существует только одно предопределенное значение - NULL. Только NULL-указатель гарантированно не указывает ни на какой объект.
0
insideone
Модератор
Автор FAQ
3647 / 927 / 53
Регистрация: 10.01.2010
Сообщений: 2,498
03.06.2010, 14:07  [ТС] #3
Ну почему же, допустим если самому контролировать выделения памяти то можно записывать какие участки заняты и потом проверять. По сути Windows имеет такие таблицы, тогда может средствами WinAPI?
0
CheshireCat
Эксперт С++
2903 / 1252 / 81
Регистрация: 27.05.2008
Сообщений: 3,436
03.06.2010, 14:13 #4
Если самому контролировать выделения памяти - то чем это отличается от "это все можно контролировать "над" объектом" ? В чем упрощение?
А что касается подхода собственно Windows и WinAPI, то выделение и удаление памяти осуществляет CRT - C Run-Time Library, и сама Windows к этому процессу не имеет отношения. Функции WinAPI типа VirtualAlloc() передают виртуальную память очень большими "кусками" менеджеру памяти СRT, который уже "нарезает" ее на мелкие кусочки нужного размера и распределяет их объектам.
1
Evg
Эксперт CАвтор FAQ
18884 / 6839 / 498
Регистрация: 30.03.2009
Сообщений: 19,247
Записей в блоге: 30
03.06.2010, 14:18 #5
Цитата Сообщение от insideone Посмотреть сообщение
Ну почему же, допустим если самому контролировать выделения памяти то можно записывать какие участки заняты и потом проверять
Проверяй. При условии, что АБСОЛЮТНО ВСЕ обращения в память пройдут через твои руки. Что нереально.

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

Эта проблема встала уже очень давно и многие компании пытались её решить через всяческие тэгированные и дескрипторные архитектуры. Многие из этих архитектур были созданы (либо на бумаге, либо в виде реального железа), по ним защитили множество кандидатских и докторских, после чего успешно всё отправлено на свалку. Как минимум потому, что очень много реального софта в процессе работы обращаются к неинициализированным участкам данных или некорректноработают с указателями, но это фатальным не является (типа прочитали неинициализировнное значение, но не использовали).
1
Manjak
269 / 175 / 7
Регистрация: 12.03.2010
Сообщений: 494
03.06.2010, 14:18 #6
Напрямую, по моему, никак не выйдет. Можно конечно извращаться и например следить за этим блоком памяти(а там уже решать используется ли память или про нее забыли, я бы такое не писал) на предмет записи и тд, но это будет код, чтобы побаловаться да и только
0
Evg
Эксперт CАвтор FAQ
18884 / 6839 / 498
Регистрация: 30.03.2009
Сообщений: 19,247
Записей в блоге: 30
03.06.2010, 15:03 #7
Хотя что-то я загнул. Речь идёт не об инициализированных данных, а о выделенной и невыделенной памяти. Проблема решается тем, что ты пишешь свой собственный менеджер памяти и ВСЕ вызовы по выделению памяти заруливаешь на свой менеджер. Я не помню, как это правильно сделать по синтаксису, но Си++ повзволяет в new указать конкретную память. Только фо факту это оченб быстро надоест, потому как если где-то забудешь и память выделишь любым другим способом - то у тебя всё накроется медным тазом
0
CheshireCat
Эксперт С++
2903 / 1252 / 81
Регистрация: 27.05.2008
Сообщений: 3,436
03.06.2010, 15:10 #8
На самом деле, могу дать коллеге insideone полезный совет - использовать идиому "умных указателей" (которая уже официально войдет в Стандарт C++11, а неофициально уже поддерживается std::tr1) и не ломать голову над этой проблемой.
Поверь, в разработке ПО есть гораздо более существенные проблемы, над которыми действительно стоит ломать голову и тратить время, чем рутинное управление памятью ....
1
Manjak
269 / 175 / 7
Регистрация: 12.03.2010
Сообщений: 494
03.06.2010, 15:20 #9
Я тут пошевелил опилками... если нужно выделить память именно в этот блоке то пробуем выделить. Если занято - смещаемся до свободного места и там выделяем.
0
easybudda
Модератор
Эксперт CЭксперт С++
9966 / 5889 / 996
Регистрация: 25.07.2009
Сообщений: 11,148
03.06.2010, 15:20 #10
Ещё хорошей привычкой было бы сразу после
delete some_pointer;
дописывать
some_pointer = NULL;
0
Manjak
269 / 175 / 7
Регистрация: 12.03.2010
Сообщений: 494
03.06.2010, 15:26 #11
Можно память вообще не декомитить, а держать про запас

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

Вообще на самом деле вопрос у меня встал не критичный, просто DirectX при Alt-TAB из полноэкранного приложения некоторые свои COM ресурсы освобождает (а выделял то я) они становятся битые... тут пожалуй и умные указатели не помогут
0
03.06.2010, 20:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.06.2010, 20:05
Привет! Вот еще темы с ответами:

Почему в TASM нельзя сравнивать память-память? - Assembler
То есть я понимаю, что можно либо регистр-память, либо память-регистр, либо регистр-регистр. Но почему так? И существуют ли методы, как это...

Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена - C#
При добавлении dataGridView(Visual Studio 2010) выдает ошибку "Попытка чтения или записи в защищенную память. Это часто свидетельствует о...

Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена - C#
При нажатии на пробелы выскакивает ошибка ( Application.Run(new Form5()); - Попытка чтения или записи в защищенную память. Это часто...

Внутренняя память 0.00 МБ. Не видит внутреннюю память - Android
Здраствуйте, девайс Prestigio Multipad PMP5670c_DUO. Я пытался найти способ решения проблемы, или найти прошивку, но толком ничего не...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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