С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144

Как “научить” Указатель определять, что сам Объект уже удален?

30.08.2020, 22:14. Показов 4745. Ответов 40

Студворк — интернет-сервис помощи студентам
Кажется, это называется “Висячий Указатель”, который указывает на уже удаленный Объект.
Хочется, чтоб когда Объект удаляется из памяти, то все указатели на него обращались бы NULL. Как это сделать?

М.б. существуют какие-то методики, чтобы бороться с Висячими Указателями?

Я уже отчаялся и пытаюсь придумать свой “велосипед” : типа менеджер Объектов, который регистрирует указатели и следит за удаляемыми объектами.
Но, надеюсь, что есть более простые способы.
Пожалуйста, подскажите...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.08.2020, 22:14
Ответы с готовыми решениями:

Что значит константный указатель на объект, указатель на константный объект, и как это можно использовать?
Подскажите, что значит константный указатель на объект, указатель на константный объект, и как это можно использовать??

Как проверить, быль ли удалён указатель или нет?
С похмелья голову заклинило %-) X* x=new X(); delete x; if(x) ? или как? Как проверить, удалён на данный момент указатель...

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

40
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
30.08.2020, 22:47
Есть "умные" указатели например std::shared_ptr<> остается только научится им пользоваться.

К книге Шилда был пример реализации однопоточного сборщика мусора.

Добавлено через 3 минуты
Цитата Сообщение от Artem_Pv Посмотреть сообщение
М.б. существуют какие-то методики, чтобы бороться с Висячими Указателями?
Да - просто не писать код с такими ошибками.
1
Злостный нарушитель
 Аватар для Verevkin
10242 / 5670 / 1261
Регистрация: 12.03.2015
Сообщений: 26,272
30.08.2020, 22:53
Цитата Сообщение от Artem_Pv Посмотреть сообщение
Хочется, чтоб когда Объект удаляется из памяти, то все указатели на него обращались бы NULL. Как это сделать?
Никак. Если вылезла такая хотелка, то это однозначный признак кривого планирования. Такое бывает и лечится выкидыванием говнокода в помойку и написанием нового годного кода.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
30.08.2020, 23:45
Цитата Сообщение от Artem_Pv Посмотреть сообщение
Я уже отчаялся и пытаюсь придумать свой “велосипед” : типа менеджер Объектов, который регистрирует указатели и следит за удаляемыми объектами.
Но, надеюсь, что есть более простые способы.
std::weak_ptr знает удалён объект, на который он указывает или нет. Работает только в паре с std::shared_ptr.
1
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144
31.08.2020, 09:58  [ТС]
Avazart, oleg-m1973, Verevkin,
спасибо за ответы.
Вопрос(в поднятой теме) более серьезный, чем рекомендации: "писать хороший код, а не плохой"

Стоит сложная задача, специально не сообщаю о деталях, а акцентируюсь на проблеме: Нужны такие "Указатели", которые бы умели определять, что Объект(на который ссылаются) уже был удален.
Вроде простая задача?!

К сожалению, стандартные shared_ptr и weak_ptr хоть и походят по функционалу, НО, имеют серьезные недостатки:
- Занимают много места (под каждый указатель выделяют сложный объект)
- Медленно работают (подсчитывают ссылки, обеспечивают многопоточность, ...)

В моей задаче требуется скорость и компактность, поэтому придется изобретать “велосипед”, м.б. придумать менеджер указателей, и под “указателем” сделать Index в массиве, или ID в списке, или к-л другую структуру.

Подскажите идеи?

Цитата Сообщение от Avazart Посмотреть сообщение
К книге Шилда был пример реализации однопоточного сборщика мусора.
Смотрю 4-е издание Г.Шилдт “C++. Полный справочник", но не могут найти пример. Слова “garbage” и “мусор” встречаются всего 7 раз, но примера не видно.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
31.08.2020, 10:34
Цитата Сообщение от Artem_Pv Посмотреть сообщение
К сожалению, стандартные shared_ptr и weak_ptr хоть и походят по функционалу, НО, имеют серьезные недостатки:
Это не их недостатки, это недостатки твоего образования (я правильно понимаю, что программировать ты учился на си-шарпе?). Ничего лучше shared_ptr/weak_ptr ты здесь не придумаешь. Достаточно просто научиться их использовать.

Цитата Сообщение от Artem_Pv Посмотреть сообщение
В моей задаче требуется скорость и компактность,
Задача-то какая?
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
31.08.2020, 10:40
Если не ошибаюсь книга называлась "Искусство программирования ..." или как то так.

Добавлено через 2 минуты
Цитата Сообщение от Artem_Pv Посмотреть сообщение
В моей задаче требуется скорость и компактность, поэтому придется изобретать “велосипед”, м.б. придумать менеджер указателей, и под “указателем” сделать Index в массиве, или ID в списке, или к-л другую структуру.
Мм и реализовать в этом менеджере ф-ционал умных указателей, т.е. подсчет ссылок и обманывать себя что это будет работать быстрее?

Не по теме:

Цитата Сообщение от oleg-m1973 Посмотреть сообщение
я правильно понимаю, что программировать ты учился на си-шарпе?


1
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
31.08.2020, 11:08
Цитата Сообщение от Artem_Pv Посмотреть сообщение
Смотрю 4-е издание Г.Шилдт “C++. Полный справочник", но не могут найти пример. Слова “garbage” и “мусор” встречаются всего 7 раз, но примера не видно.
Наверное потому, что в с++ можно не генерить горы мусора. Соответственно, его сборщики не так актуальны, как в других популярных языках.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
31.08.2020, 11:43
Цитата Сообщение от Artem_Pv Посмотреть сообщение
Смотрю 4-е издание Г.Шилдт “C++. Полный справочник", но не могут найти пример. Слова “garbage” и “мусор” встречаются всего 7 раз, но примера не видно.
Герберт Шилдт - Искусство программирования на С++
1
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
31.08.2020, 12:27
Цитата Сообщение от Artem_Pv Посмотреть сообщение
Занимают много места (под каждый указатель выделяют сложный объект)
Не под каждый указатель, а под каждый объект (хранимый).

Цитата Сообщение от Artem_Pv Посмотреть сообщение
поэтому придется изобретать “велосипед”, м.б. придумать менеджер указателей, и под “указателем” сделать Index в массиве, или ID в списке, или к-л другую структуру.
Это полная ерунда и будет медленнее, чем даже решение в лоб через shared_ptr.

В С++ нафиг это все не надо. И shared_ptr в том числе в единицах случаев действительно нужен. unique_ptr в большинстве случаев достаточно.

Если у тебя образуются висячие указатели, значит ты фигово применяешь инструмент (С++), не разобрался в методологии (RAII), придумал плохую архитектуру и т.д. Это даже не мое мнение, а просто факт, иначе бы С++ не был таким, какой он есть, а был бы похож на С# или подобные. И чтобы ты не говорил мне в ответ на это - реальность не изменится и единственный способ выйти из порочного круга - это повышать свое образование, а не пытаться натягивать сову на глобус.
1
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
31.08.2020, 13:07
Цитата Сообщение от ablex Посмотреть сообщение
shared_ptr.
Не такой уж тяжелый объект, там указатель и счетчик по сути. Учитывая что сам объект который хранится по указателю более тяжелый - это копейки.

Если же объект легкий то стоит вообще не удалять объекты, а использовать их из пула объектов.

В любом случае все зависит от конкретных условий.
0
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
31.08.2020, 13:11
Avazart, я нигде не писал, что он тяжелый.
0
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144
31.08.2020, 13:37  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Герберт Шилдт - Искусство программирования на С++
Avazart, спасибо за ответ.
Пример в книге найден, но, к сожалению, не походит для моей задачи, т.к. подсчет ссылок НЕ требуется, и как выше писалось, это слишком ресурсоемко. Аналогичная проблема с shared_ptr, ... да, он решает мою задачу, но реализован слишком “круто”, и требует много ресурсов и это критично.

Чтоб стало ясно, я тестирую реальный пример:
В задаче задействовано (внимание)100 млн. “указателей” на разные объекты(их около 1 млн.). Причем обычные (32 bit)указатели работают быстро и компактно. Программа летает и все хорошо, НО, эти указатели не умеют отслеживать удаление объектов (они становятся “висячими указателями”).
Поэтому ищется оптимальная замена.
Просто заменить обычные указатели на shared_ptr - на таких количествах НЕ удается. Экспериментальным путем находим пределы, где программа перестает зависать и расходовать всю память. Пришлось уменьшить кол-во shared_ptr на много порядков меньше, чем требуется (см. цифру выше). И это только чтоб запустить программу. Но, мучения на этом НЕ заканчиваются, т.к. удаления объектов(на которые ссылаются shared_ptr) превращается в дикие тормоза.

Никто не спорит, что shared_ptr - хороший, удобный указатель; НО, в моей задаче он слишком ресурсоемкий (по сравнению с обычным указателем), к сожалению, не подходит для, казалось бы, простой вещи:
“Если объект удаляется, то указатели на него обнуляются”.
Неужели сложно придумать решение?!
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
31.08.2020, 13:47
Artem_Pv,

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

частным образом, потому что это никак не спасет от ситуации, когда память была освобождена, а затем снова занята до выполнения этого запроса - будет ложная информация о том, что с указателем все в порядке.
1
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
31.08.2020, 13:49
Цитата Сообщение от Artem_Pv Посмотреть сообщение
Неужели сложно придумать решение?!
Ты как врач, который лечит симптомы, вместо лечения причин. У таких врачей пациенты умирают. Вот и вся правда.
Без затрат ресурсов отследить владеет ли указатель все еще объектом или объект уже сдох - невозможно. Именно поэтому С++ не предлагает ничего подобного по умолчанию.
В твоей ситуации единственный вариант - это не допускать висячих указателей вообще - переписать этот проблемный код нормально: только хирургия, никаких припарок.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
31.08.2020, 13:55
Цитата Сообщение от Artem_Pv Посмотреть сообщение
т.к. подсчет ссылок НЕ требуется,
А что требуется тогда? Как Вы предлагаете определять объекты которые не используются?

Добавлено через 1 минуту
Цитата Сообщение от Artem_Pv Посмотреть сообщение
к сожалению, не подходит для, казалось бы, простой вещи:
“Если объект удаляется, то указатели на него обнуляются”.
И как по Вашему объект должен знать о всех указателях на него? Путем телепатии?

Добавлено через 48 секунд
Цитата Сообщение от Artem_Pv Посмотреть сообщение
Неужели сложно придумать решение?!
Вы страдаете фигней.
0
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144
31.08.2020, 14:41  [ТС]
"Висячие указатели" - это НЕ проблема, они никак НЕ мешают, и НЕ беспокоят, я просто указал этот термин, чтоб было понятно, о чем речь.

Ух, еще раз попробую акцентировать внимание на суть темы.
Для очень серьезной/уникальной задачи(OLAP-куб), ищется методика: Научить объекты чистить за собой указатели.

Цитата Сообщение от Avazart Посмотреть сообщение
И как по Вашему объект должен знать о всех указателях на него?
Так это есть вопрос темы.
Ведь, shared_ptr как-то знает об указателях? Да знает.
А как он это делает, есть идеи?

Цитата Сообщение от DrOffset Посмотреть сообщение
частным образом может помочь замена аллокатора на пул-подобный менеджер памяти, с возможностью запроса используя значение указателя на предмет освобождена была память или нет.
DrOffset, спасибо за ответ.

Я ищу методику(идею).
Например:
- под "указателем" подразумевать структуру/обертку вокруг обычного указателя
- объекты создаются/удаляются строго через специальный менеджер, который также следит за указателями
- и т.д...

Ведь в основе "shared_ptr" тоже лежит какая-то идея, и чтоб методика заработала, где-то в глубине они хранят структуры под каждый указатель и следят за уничтожением объектов. Или как-то по-другому. Вот как?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
31.08.2020, 14:58
Цитата Сообщение от Artem_Pv Посмотреть сообщение
Ведь, shared_ptr как-то знает об указателях? Да знает.
А как он это делает, есть идеи?
В смысле - идеи? Это документировано, никаких идей не надо.

Для каждого хранимого объекта (именно хранимого объекта, а не самого указателя) создается структура с счетчиком ссылок. При увеличении количества указателей счетчик ссылок увеличивается, при уменьшении - уменьшается. Таким образом можно знать сколько еще осталось активных владельцев-указателей данным объектом.
1
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
31.08.2020, 14:59
Цитата Сообщение от Artem_Pv Посмотреть сообщение
Ведь, shared_ptr как-то знает об указателях? Да знает.
А как он это делает, есть идеи?
Не знает, он просто знает об общем счетчике.
Можно конечно и все объекты помнить он это куда накладнее.
0
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144
31.08.2020, 15:14  [ТС]
Цитата Сообщение от ablex Посмотреть сообщение
Ты как врач, который лечит симптомы, вместо лечения причин.
Пациент приходит к врачу с разбитой головой, жалуется, что на улице упал кирпич на голову. Врач со словами “я лечу причину” и идет на улицу и прячет кирпич, что больше не падал. Жаль пациента, так и сидит с разбитой головой.
;-/

P.S.
Еще жаль, что серьезная задача(OLAP-куб) обернулась в офф-топик.

Добавлено через 12 минут
Цитата Сообщение от DrOffset Посмотреть сообщение
структура с счетчиком ссылок
А зачем вообще здесь счетчик ссылок? Ведь, чтоб их обнулять нужно знать сами ссылки(а не их количество).

Речь идет про динамический объект:
1. создаем Объект
2. присваиваем N указателей на Объект
3. удаляем Объект
4. (внимание)здесь нужно, чтоб эти N указателей обнулились
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.08.2020, 15:14
Помогаю со студенческими работами здесь

Основы: указатель на объект или объект, что выбрать?
Не до конца понимаю (или вообще не понимаю) когда лучше использовать указатель на объект, а когда объект. Например: // есть класс ...

Как двигать объект, когда нажимаешь на сам объект?
Здравствуйте, такая вот не приятная ситуация сам новичок в С# Хотел бы узнать как двигать обьект при прикосновении именно к нему а не...

Как преобразовать ссылку на объект в указатель на этот объект?
Как преобразовать ссылку на объект в указатель на этот объект? Буду благодарен за помощь.

Проверка удален ли объект
Здравствуйте, ни как не могу придумать как сделать проверку удален ли объект. На сцене есть объект, когда персонаж касается его он...

Удалить сочетание клавиш у ярлыка, который уже удален
Для каждого ярлыка на рабочем столе, через свойство можно задать сочетание клавиш (для быстрого вызова этого ярлыка). Но вот беда, ярлык...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
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
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru