Пятница, 08 Ноября 2024, 12:36

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Обнуление указателей
SilverOverlordДата: Четверг, 18 Апреля 2013, 15:16 | Сообщение # 1
был не раз
Сейчас нет на сайте
Привет всем! Опишу проблему:
В игре есть разные объекты: человечки, деревья, и всё такое. В общем, всё как обычно.
Несомненно, должны существовать переменные, содержащие адрес какого-то объекта (например, "в этой переменной хранится, какое дерево рубит этот человек"). Это может быть просто указатель или индекс в каком-нибудь массиве для всех объектов - не важно.
Суть проблемы в том, что когда объект удаляется, то на его место в памяти может создаться какой-нибудь другой объект. И тогда этот указатель на удалённый объект станет устаревшим, обращение по нему приведёт к действиям над новым объектом, а это не есть хорошо.
Вариант "запретить занимать память, в которой был старый объект" не катит по разумным причинам - такие "могилки" в памяти приводят к утечкам.

Хочу знать, насколько разумен такой вариант:
В каждом объекте находится список всех указателей, которые на него ссылаются. При удалении объекта они все обнуляются.
При этом указатель - это особый объект, который при изменении значения записывает в список объекта себя и всё такое.
falcowareДата: Четверг, 18 Апреля 2013, 15:21 | Сообщение # 2
старожил
Сейчас нет на сайте
SilverOverlord, я думаю все куда проще. Перед каждой отрисовкой пробежаться по всем указателям и убить старые.
SilverOverlordДата: Четверг, 18 Апреля 2013, 15:22 | Сообщение # 3
был не раз
Сейчас нет на сайте
Указателей может быть много.

Добавлено (18.04.2013, 15:22)
---------------------------------------------
И находиться они могут много где.

falcowareДата: Четверг, 18 Апреля 2013, 15:42 | Сообщение # 4
старожил
Сейчас нет на сайте
SilverOverlord, ну создать массив указателей и убивать их из списка перед каждой отрисовкой.
SilverOverlordДата: Четверг, 18 Апреля 2013, 15:43 | Сообщение # 5
был не раз
Сейчас нет на сайте
Я считаю процесс пробежки по этому массиву N раз в секунду долгим...
falcowareДата: Четверг, 18 Апреля 2013, 16:00 | Сообщение # 6
старожил
Сейчас нет на сайте
SilverOverlord, тогда создать список удаленных указателей и удалять их перед отрисовкой.
SilverOverlordДата: Четверг, 18 Апреля 2013, 16:04 | Сообщение # 7
был не раз
Сейчас нет на сайте
И что же хранить в этом списке? Указатели на удалённые объекты или указатели на указатели, которые нужно обнулять? Если первое, то это чушь. Если второе, то всяко понадобится для каждого объекта список указателей, которые на него ссылаются.
RUNGOGET2THECHOPAHДата: Четверг, 18 Апреля 2013, 16:24 | Сообщение # 8
участник
Сейчас нет на сайте
Все это уже давным давно реализовано. Гугли weak_ptr.
ArchidoДата: Четверг, 18 Апреля 2013, 17:36 | Сообщение # 9
Сэнсэй
Сейчас нет на сайте
Цитата (RUNGOGET2THECHOPAH)
Суть проблемы в том, что когда объект удаляется, то на его место в памяти может создаться какой-нибудь другой объект. И тогда этот указатель на удалённый объект станет устаревшим, обращение по нему приведёт к действиям над новым объектом, а это не есть хорошо.

Если проблема только в том, что вместо удаленного объекта непреднамеренно появится новый того же типа (или если они имеют общий базовый класс, на крайняк), то самый простой способ присвоить каждому объекту некий уникальный Id и хранить его рядом с указателем (и в самом объекте тоже ессно), и перед тем как делать чего-либо с этим объектом - сравнивать эти Id'ы и делать выводы.

А по проблемам с обращением по невалидному указателю есть смарт поинтеры, да. Ну или хендлы, на вкус и цвет уж.


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)

Сообщение отредактировал Archido - Четверг, 18 Апреля 2013, 17:38
OpenGOOДата: Четверг, 18 Апреля 2013, 18:14 | Сообщение # 10
почти ветеран
Сейчас нет на сайте
Достаточно только считать количество указателей

Мои проекты:
- Свободный и открытый клон World Of Goo
- TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)

[GameMaker: Studio v1.4.9999]
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг