17 / 17 / 5
Регистрация: 19.09.2012
Сообщений: 216
|
||||||||||||||||
1 | ||||||||||||||||
Проблема с указателем на элемент вектора15.07.2015, 16:38. Показов 2206. Ответов 54
Метки нет (Все метки)
Всем доброго времени суток. Не могу никак выкрутиться)
Допустим, у нас есть класс "А" с параметрами:
TNode:
0
|
15.07.2015, 16:38 | |
Ответы с готовыми решениями:
54
Как правильно обратиться к элементам полиморфного вектора (с умным указателем)? Проблема с указателем на функцию Проблема с указателем мыши Проблема с указателем на строку |
70 / 64 / 40
Регистрация: 17.02.2014
Сообщений: 265
|
|
15.07.2015, 18:19 | 2 |
Если элемент общий для двух классов - значит он указывает на один адрес, неудивительно что вы получаете падение программы - класс A удалил свои данные, но класс B продолжает ссылаться на них - разыменование приводит к падению поскольку по адресу уже ничего нету или записаны другие данные. Вообще хотелось бы увидеть весь код, может дело в другом.
0
|
17 / 17 / 5
Регистрация: 19.09.2012
Сообщений: 216
|
||||||
15.07.2015, 18:29 [ТС] | 3 | |||||
smartpointer, я прекрасно понимаю из-за чего падает. Мне нужны идеи как избежать краха программы. Как проверить этот указатель, возможно ли разыменование для него или нет ? как отловить момент удаления из класса "В"
Добавлено через 5 минут Хотя нет, все гораздо веселее >_<
0
|
70 / 64 / 40
Регистрация: 17.02.2014
Сообщений: 265
|
|
15.07.2015, 18:29 | 4 |
Нужна ссылка на указатель, но если не ошибаюсь std::vector этого не позволяет делать - вместо этого попробуйте хранить адрес самого указателя (std::vector<TNode**>) и при удалении элемента нулите указатель, чтобы класс B не мог его удалить - соответсвенно в классе B нужно проверять этот указатель на ноль, как-то так.
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
15.07.2015, 18:34 | 5 |
Лучше хранить индекс элемента из вектора, а не указатели.
0
|
17 / 17 / 5
Регистрация: 19.09.2012
Сообщений: 216
|
|
15.07.2015, 18:44 [ТС] | 6 |
smartpointer, при удалении А пишу nodes[i] = NULL; но при проверке в В он не является нулевым. Как это сделать правильно ? DrOffset, изначально исходный вектор недоступен в классе В
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
||||||
15.07.2015, 18:49 | 7 | |||||
Это непреодолимое условие?
Как-то вот так сделать не вариант?
0
|
17 / 17 / 5
Регистрация: 19.09.2012
Сообщений: 216
|
|
15.07.2015, 19:03 [ТС] | 8 |
DrOffset, в общем сейчас все сделано так: пишу графический редактор, есть элементы, которые между собой соединяются проводом. Каждый элемент несет в себе узлы (TNode) к которым можно цеплять провод, координаты которых меняются с перемещением базового объекта. Кликаем по двум элементам, создается объект провода между ними в который передаются указатели на ТNode двух объектов. И все двигается с закрепленными в нужных местах проводами. Методы которые вы сиправили используются только для отрисовки. Нужно много править чтобы оттуда передавать вектора.
0
|
70 / 64 / 40
Регистрация: 17.02.2014
Сообщений: 265
|
||||||
15.07.2015, 19:06 | 9 | |||||
Вот накидал пример (вроде не крашится), однако вам придется управлять как-то вектором, если вы будете удалять узел из B объекта.
1
|
76 / 76 / 32
Регистрация: 14.04.2014
Сообщений: 408
|
||||||
15.07.2015, 19:12 | 10 | |||||
никнейм первого ответившего какбэ намекает на самое просто и мощное решение. Но я слышал, что умные указатели в векторе лучше не хранить.
А вообще я не совсем понял проблему.
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
15.07.2015, 19:23 | 11 |
Fobes, тогда уж проще в векторе держать shared_ptr вместо объектов, а в узлах weak_ptr.
http://ru.cppreference.com/w/cpp/memory/shared_ptr http://ru.cppreference.com/w/cpp/memory/weak_ptr https://msdn.microsoft.com/en-... 79672.aspx
0
|
17 / 17 / 5
Регистрация: 19.09.2012
Сообщений: 216
|
|
15.07.2015, 19:32 [ТС] | 12 |
DrOffset, пишу в embarcadero xe8, как я понял там таких умных указателей нету =/
Fallenworld, я вроде достаточно понятно все расписал
0
|
Комп_Оратор)
|
|
15.07.2015, 19:46 | 13 |
Fobes, он это кто? В векторе хранятся указатели и в другом классе хранятся указатели и общее у них - адреса на которые они смотрят. Но это же разные переменные. Вспомните, - при создании вектора он запускает конструктора, то есть создаёт объекты. Поэтому установив в ноль его указатель Вы ничего не сделали для изменения указателя в классе B так как это просто разные переменные. А память то освободили и разыменование по адресу - UB. Как вариант, совет smartpointer, может сработать. Имея указатель на указатель в векторе и указатель в классе B вы будете иметь доступ к одной и той же переменной из обоих классов. Однако такое построение это надругательство над инкапсуляцией как таковой.
Если связь этих классов неминуема, то может сделать один вложенным и организовать доступ к указателю через класс член (его метод)? То есть в векторе хранить не непосредственно указатели, а экземпляры B (которые хранят указатели).
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
15.07.2015, 20:09 | 14 |
Такие же есть в бусте. В embarcadero, насколько я помню, он штатным установщиком даже ставится вместе со всем остальным.
http://www.boost.org/doc/libs/... ed_ptr.htm http://www.boost.org/doc/libs/... ak_ptr.htm
1
|
17 / 17 / 5
Регистрация: 19.09.2012
Сообщений: 216
|
|
15.07.2015, 23:53 [ТС] | 15 |
DrOffset, так, доставил в свою версию буст)) А можно чуть поразвернутее про выбор именно этих умных указателе ?
0
|
16.07.2015, 00:09 | 16 |
И чем это поможет?
Абсолютно ничем, получите невалидный индекс вместо невалидного указателя. Добавлено через 1 минуту Умные же указатели- тоже не подходят так как не решат проблему согласования, ибо просто не удалят элемент.
0
|
17 / 17 / 5
Регистрация: 19.09.2012
Сообщений: 216
|
|
16.07.2015, 00:10 [ТС] | 17 |
Avazart, как же быть то тогда ?
0
|
16.07.2015, 00:23 | 18 |
Класс B должен "извещать" из своего деструктора все зависимые классы об своем удалении.
Есть другой вариант не удалять объект вообще а просто помечать его "невалидным" и действовать как будто его нет, самое просто, но ценой памяти.
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
16.07.2015, 00:26 | 19 |
Невалидный индекс хотя бы можно проверить. Битый указатель же не проверишь уже точно.
Вообще все эти советы были даны исходя из того, что автор хочет отделаться малой кровью. Не переписывать код. Естественно, правильным подходом было перепроектировать и переписать код полностью. В том числе с учетом твоих замечаний по поводу извещения об удалении, с которыми я полностью согласен.
0
|
16.07.2015, 00:28 | 20 |
Мм и каким чудом?
Куда будет указывать индекс после удаления? На другой элемент?
1
|
16.07.2015, 00:28 | |
16.07.2015, 00:28 | |
Помогаю со студенческими работами здесь
20
Проблема с умным указателем std::unique_ptr Заменить максимальный элемент изначального вектора на первый минимальный элемент изначального вектора Список с указателем на последний элемент Заменить элементы вектора, равные максимальному, на последний элемент вектора Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |