|
17 / 17 / 5
Регистрация: 19.09.2012
Сообщений: 216
|
||||||||||||||||
Проблема с указателем на элемент вектора15.07.2015, 16:38. Показов 3664. Ответов 54
Метки нет (Все метки)
Всем доброго времени суток. Не могу никак выкрутиться)
Допустим, у нас есть класс "А" с параметрами:
TNode:
0
|
||||||||||||||||
| 15.07.2015, 16:38 | |
|
Ответы с готовыми решениями:
54
Как правильно обратиться к элементам полиморфного вектора (с умным указателем)? Проблема с указателем на функцию Проблема с указателем мыши |
|
17 / 17 / 5
Регистрация: 19.09.2012
Сообщений: 216
|
|
| 16.07.2015, 00:44 [ТС] | |
|
Avazart, на счет не валидности хороший вариант)) такой вопрос. Указатель ведь является объектом автоматической памяти ? т.е. очистить память выделенную в одном месте можно через тот же указатель но в другом класса ?
0
|
|
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
|
||||||||
| 16.07.2015, 01:17 | ||||||||
|
Добавлено через 13 минут
Но вариант я уведомлением все-таки лучше. Архитектурно.
2
|
||||||||
|
Комп_Оратор)
|
|||
| 16.07.2015, 07:16 | |||
|
0
|
|||
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
|
||
| 16.07.2015, 08:17 | ||
|
0
|
||
|
Комп_Оратор)
|
||
| 16.07.2015, 09:01 | ||
|
Они - в векторе класса A и еще такие же где-то ещё (в классе B) указывают на одну и ту же память. После очистки памяти через вектор к ней нельзя не обратиться ни проверить возможность доступа из класса В. Это нормально. Поэтому я и говорю, что указатель нельзя чистить где ни попадя. Хотя если отдавать его куда ни попадя, то всегда есть искушение.
0
|
||
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
|
||
| 16.07.2015, 09:12 | ||
|
1
|
||
|
Комп_Оратор)
|
|||
| 16.07.2015, 09:38 | |||
|
Надо же тоже delete, чтобы и при обращении через вектор из A всё крэшилось. Тогда может понятней будет?
0
|
|||
|
17 / 17 / 5
Регистрация: 19.09.2012
Сообщений: 216
|
|||||||||||||||||||||
| 16.07.2015, 10:40 [ТС] | |||||||||||||||||||||
|
IGPIGP, DrOffset, сорри, вчера уснул )) Выкрутился в общем, правда не знаю к чему это сейчас приведет, на мой взгляд все должно работать нормально. Растолкуйте, умные люди плиз)
к классу TNode добавил 2 поля:
При удалении об А деструктор стал выглядеть так:
0
|
|||||||||||||||||||||
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
|
||||||||
| 16.07.2015, 10:57 | ||||||||
|
Только вот есть два момента. Если мы удаляем из вектора, например из середины, то адреса следующих за удаленным объектов изменятся. Если у тебя на них были подвязаны узлы, то будет ой. Во-вторых правильно так:
![]() ____ Поэтому, если хочешь остановиться на варианте с фиктивным удалением, то вектор уже трогать нельзя. Просто помечай элемент как удаленный, но не удаляй его по-настоящему. Либо вектор заменяй на другой контейнер, где элементы хранятся не единым блоком. Например на list. Тогда удаление одного элемента не будет влиять на другие. Добавлено через 7 минут Короче. Давай код что-ли, более-менее цельный. Тогда и видно будет правильно там или нет. А то гадание какое-то
1
|
||||||||
|
17 / 17 / 5
Регистрация: 19.09.2012
Сообщений: 216
|
||||||
| 16.07.2015, 11:01 [ТС] | ||||||
|
DrOffset, так я же написал в первом посте) В классе А у нас вектор указателей
0
|
||||||
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
|
||
| 16.07.2015, 11:02 | ||
|
Fobes, И да, вариант с умными указателями (выше пост) будет работать. Он хуже, чем некоторые другие варианты, требующие изменения архитектуры, но работать он будет.
Добавлено через 1 минуту
0
|
||
|
17 / 17 / 5
Регистрация: 19.09.2012
Сообщений: 216
|
|
| 16.07.2015, 11:04 [ТС] | |
|
DrOffset, окай, с удалением учту, всем спасибо большое. Вопрос решен. ^_^
0
|
|
|
|
||||||
| 16.07.2015, 14:15 | ||||||
|
Если наброском как-то так:
1
|
||||||
|
Комп_Оратор)
|
||
| 16.07.2015, 14:31 | ||
![]() Тут надо указатель оборачивать чем-то, но тогда уж лучше смарт использовать какой-то. Или сделать один класс полем другого и обращаться по указателю только через владельца. В идеале вообще не давать указатель наружу.
0
|
||
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
|
|||
| 16.07.2015, 16:03 | |||
![]()
0
|
|||
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
|
||
| 16.07.2015, 16:23 | ||
|
В этом выражении после конструирования переменной spt, у нее будет вызван operator bool(), ну и соответственно произведена проверка.
0
|
||
| 16.07.2015, 16:26 | ||||||
|
Не по теме: Значит стайл ...
0
|
||||||
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
|
|
| 16.07.2015, 16:34 | |
|
Добавлено через 7 минут Не по теме: Avazart, ты путаешь. Мой код и твой - разные. Тут где-то на форуме проскакивал вопрос из книги Страуструпа с таким же кодом. Суть этого в том, чтобы объявлять переменные там, где они используются и сразу инициализировать их. В данном случае spt имеет смысл только внутри if и его область видимости ограничена скобками if. Это чисто С++сный подход. В этом случае = - это не присваивание, а инициализация. Т.е. здесь работает конструктор. Поэтому этот код не вызовет у компилятора никаких предупреждений.
0
|
|
| 16.07.2015, 16:34 | |
|
Не по теме: Че не понятно... плохая практика в условиях использовать присваивание, плохо читается = / == .
0
|
|
| 16.07.2015, 16:34 | |
|
Проблема с указателем на строку Проблема с умным указателем std::unique_ptr
Список с указателем на последний элемент Заменить элементы вектора, равные максимальному, на последний элемент вектора Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео:
https:/ / vkvideo. ru/ video-240781534_456239017
YouTube:
eY5-5PyI9NM
Текстовая версия
|
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать
Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
|
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства.
Родственных связей существует 8 ступеней, такие как:
p - отец
P - мать
q - муж
Q - жена
b - брат
B - сестра
s - сын
S - дочь
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
|
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701
Купил два термопринтера QR701.
На сэлф-тесте написано:
Language: PC936 (GB18030).
Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
|