|
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144
|
|
Как “научить” Указатель определять, что сам Объект уже удален?30.08.2020, 22:14. Показов 4745. Ответов 40
Метки висячий указатель (Все метки)
Кажется, это называется “Висячий Указатель”, который указывает на уже удаленный Объект.
Хочется, чтоб когда Объект удаляется из памяти, то все указатели на него обращались бы NULL. Как это сделать? М.б. существуют какие-то методики, чтобы бороться с Висячими Указателями? Я уже отчаялся и пытаюсь придумать свой “велосипед” : типа менеджер Объектов, который регистрирует указатели и следит за удаляемыми объектами. Но, надеюсь, что есть более простые способы. Пожалуйста, подскажите...
0
|
|
| 30.08.2020, 22:14 | |
|
Ответы с готовыми решениями:
40
Что значит константный указатель на объект, указатель на константный объект, и как это можно использовать? Как проверить, быль ли удалён указатель или нет? Нужно научить прогу определять дату |
|
|
||
| 30.08.2020, 22:47 | ||
|
Есть "умные" указатели например std::shared_ptr<> остается только научится им пользоваться.
К книге Шилда был пример реализации однопоточного сборщика мусора. Добавлено через 3 минуты
1
|
||
|
Злостный нарушитель
10242 / 5670 / 1261
Регистрация: 12.03.2015
Сообщений: 26,272
|
||
| 30.08.2020, 22:53 | ||
|
0
|
||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
| 30.08.2020, 23:45 | ||
|
1
|
||
|
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144
|
||
| 31.08.2020, 09:58 [ТС] | ||
|
Avazart, oleg-m1973, Verevkin,
спасибо за ответы. Вопрос(в поднятой теме) более серьезный, чем рекомендации: "писать хороший код, а не плохой" Стоит сложная задача, специально не сообщаю о деталях, а акцентируюсь на проблеме: Нужны такие "Указатели", которые бы умели определять, что Объект(на который ссылаются) уже был удален. Вроде простая задача?! К сожалению, стандартные shared_ptr и weak_ptr хоть и походят по функционалу, НО, имеют серьезные недостатки: - Занимают много места (под каждый указатель выделяют сложный объект) - Медленно работают (подсчитывают ссылки, обеспечивают многопоточность, ...) В моей задаче требуется скорость и компактность, поэтому придется изобретать “велосипед”, м.б. придумать менеджер указателей, и под “указателем” сделать Index в массиве, или ID в списке, или к-л другую структуру. Подскажите идеи?
0
|
||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
|||
| 31.08.2020, 10:34 | |||
|
0
|
|||
|
|
||
| 31.08.2020, 10:40 | ||
|
Если не ошибаюсь книга называлась "Искусство программирования ..." или как то так.
Добавлено через 2 минуты
1
|
||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
| 31.08.2020, 11:08 | ||
|
0
|
||
|
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
|
|||
| 31.08.2020, 12:27 | |||
|
В С++ нафиг это все не надо. И shared_ptr в том числе в единицах случаев действительно нужен. unique_ptr в большинстве случаев достаточно. Если у тебя образуются висячие указатели, значит ты фигово применяешь инструмент (С++), не разобрался в методологии (RAII), придумал плохую архитектуру и т.д. Это даже не мое мнение, а просто факт, иначе бы С++ не был таким, какой он есть, а был бы похож на С# или подобные. И чтобы ты не говорил мне в ответ на это - реальность не изменится и единственный способ выйти из порочного круга - это повышать свое образование, а не пытаться натягивать сову на глобус.
1
|
|||
|
|
||
| 31.08.2020, 13:07 | ||
|
Если же объект легкий то стоит вообще не удалять объекты, а использовать их из пула объектов. В любом случае все зависит от конкретных условий.
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 [ТС] | ||
|
Пример в книге найден, но, к сожалению, не походит для моей задачи, т.к. подсчет ссылок НЕ требуется, и как выше писалось, это слишком ресурсоемко. Аналогичная проблема с 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 | ||
|
Без затрат ресурсов отследить владеет ли указатель все еще объектом или объект уже сдох - невозможно. Именно поэтому С++ не предлагает ничего подобного по умолчанию. В твоей ситуации единственный вариант - это не допускать висячих указателей вообще - переписать этот проблемный код нормально: только хирургия, никаких припарок.
0
|
||
|
|
||||
| 31.08.2020, 13:55 | ||||
|
Добавлено через 1 минуту Добавлено через 48 секунд
0
|
||||
|
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144
|
|||
| 31.08.2020, 14:41 [ТС] | |||
|
"Висячие указатели" - это НЕ проблема, они никак НЕ мешают, и НЕ беспокоят, я просто указал этот термин, чтоб было понятно, о чем речь.
Ух, еще раз попробую акцентировать внимание на суть темы. Для очень серьезной/уникальной задачи(OLAP-куб), ищется методика: Научить объекты чистить за собой указатели. ![]() Ведь, shared_ptr как-то знает об указателях? Да знает. А как он это делает, есть идеи? Я ищу методику(идею). Например: - под "указателем" подразумевать структуру/обертку вокруг обычного указателя - объекты создаются/удаляются строго через специальный менеджер, который также следит за указателями - и т.д... Ведь в основе "shared_ptr" тоже лежит какая-то идея, и чтоб методика заработала, где-то в глубине они хранят структуры под каждый указатель и следят за уничтожением объектов. Или как-то по-другому. Вот как?
0
|
|||
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
||
| 31.08.2020, 14:58 | ||
|
Для каждого хранимого объекта (именно хранимого объекта, а не самого указателя) создается структура с счетчиком ссылок. При увеличении количества указателей счетчик ссылок увеличивается, при уменьшении - уменьшается. Таким образом можно знать сколько еще осталось активных владельцев-указателей данным объектом.
1
|
||
|
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144
|
|||
| 31.08.2020, 15:14 [ТС] | |||
|
;-/ P.S. Еще жаль, что серьезная задача(OLAP-куб) обернулась в офф-топик. Добавлено через 12 минут Речь идет про динамический объект: 1. создаем Объект 2. присваиваем N указателей на Объект 3. удаляем Объект 4. (внимание)здесь нужно, чтоб эти N указателей обнулились
0
|
|||
| 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
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|