|
1 / 1 / 0
Регистрация: 21.11.2017
Сообщений: 24
|
|||||||||||
Работа с std::vector содержащим указатели21.11.2017, 12:27. Показов 2538. Ответов 49
Метки нет (Все метки)
Привет! Я долгое время находился в ридонли, решил всё же задать вопрос, так как проблему не получается решить самостоятельно, из-за нехватки знаний по всей видимости. Оговорюсь, что на момент как я решил выучить c++, я уже хорошо знал несколько языков в том числе python java php и так далее.
Пишу небольшую игру на С++, кодовая база получилась уже сейчас довольно большая (для меня как только-только изучающего с++). Всё бы хорошо кроме одного момента. В программе есть вектор содержащий все сущности игры вида:
и вызова у каждой из них ->update(), всё в принципе стандартно. Всё работает хорошо и как нужно кроме одного момента: Периодически абсолютно в неясные для меня моменты (то есть какой либо зависимости у этих событий нет) получаю segfault либо на ->update(); (если я компилирую в g++) либо на сортировке объектов, в случае добавления новых сущностей для сохранения порядка отрисовки (если компилирую в msvc). segfault вызванный тем, что я пытаюсь вызвать метод объекта из вектора, при том что указатель ссылается на чистую область памяти (то есть объекта там уже нет) Разработку веду в clion (gcс + mingw) И периодами сверяюсь с msvc (там удобный профайлер, да и в целом компилятор по умолчанию более строгий). Понятно что весь код внутри update, я физически привести не смогу, вопрос вот в чем, может быть есть какие-то методики для понимания кто и в каком месте заменяет на heap'e реальные объекты таким образом, что указатель ведёт на чистую область памяти где не содержится изначально искомого объекта? Либо же я просто совершаю некую распространенную ошибку новичка и каким-то не правильным образом работаю с вектором таким образом что при наступлении определенных событий происходит segfault? Сразу оговорюсь, resize() у вектора я сам не вызываю, то есть аллокация новых элементов происходит автоматом и происходит успешно до какого-то момента. Так же я могу привести кусок кода на котором возникает (в случае неопределенных обстоятельств) segfault при gcc компиляции.
0
|
|||||||||||
| 21.11.2017, 12:27 | |
|
Ответы с готовыми решениями:
49
Как передать целочисленную матрицу типа std::vector<std::vector<int> > в функцию? Вывести значения std::vector<std::vector<int*> > |
|
77 / 50 / 16
Регистрация: 17.05.2015
Сообщений: 262
|
||||||||||||
| 22.11.2017, 16:25 | ||||||||||||
0
|
||||||||||||
|
1 / 1 / 0
Регистрация: 21.11.2017
Сообщений: 24
|
|
| 22.11.2017, 17:34 [ТС] | |
|
Valeryn, проблема сейчас только в сортировке, причем только в gcc+mingw в msvc нет такой проблемы. С update разобрался
0
|
|
|
77 / 50 / 16
Регистрация: 17.05.2015
Сообщений: 262
|
|||||||||||||
| 22.11.2017, 17:51 | |||||||||||||
|
Добавлено через 8 минут
Добавлено через 4 минуты
0
|
|||||||||||||
|
1 / 1 / 0
Регистрация: 21.11.2017
Сообщений: 24
|
||
| 22.11.2017, 18:06 [ТС] | ||
0
|
||
|
77 / 50 / 16
Регистрация: 17.05.2015
Сообщений: 262
|
|
| 22.11.2017, 19:06 | |
|
Ты уверен, что указатели целы? Откуда такая уверенность? Дебагер не знает, удален обьект или нет. Он видит указатель на область памяти.
Сделай как я говорю. Обнуляй указатели во время удаления и проверяй их, перед каждым вызовом. Либо возьми или сам реализуй смартпоинтер, который это автоматически делает. Добавлено через 20 минут За место вектора используй лист. Все равно ты перебираешь контейнер последовательно. А в ставка и удаление в листе дешевле будет. У листа свой собственный метод remove. Либо переопредели операторы <=> и суй обьекты в мап, если важна сортировка. Добавлено через 15 минут В базовом классе определи флаг isRemove. Если он true - удаляй обьект. А не плоди контейнеры. Так ты сможешь за одну итерацию перебора удалить обьекты и выполнить update
0
|
|
|
1 / 1 / 0
Регистрация: 21.11.2017
Сообщений: 24
|
|
| 23.11.2017, 00:15 [ТС] | |
|
Сделал всё вышесказанное, всё равно на сортировке segfault и только в gcc. Если убрать сортировку, проблема пропадает, всё равботает как надо
0
|
|
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
||||||
| 23.11.2017, 00:51 | ||||||
|
Можно попробовать сортировку через древнюю qsort:
0
|
||||||
|
1 / 1 / 0
Регистрация: 21.11.2017
Сообщений: 24
|
||
| 23.11.2017, 01:00 [ТС] | ||
|
Что это за дичь?
0
|
||
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
|
| 23.11.2017, 01:23 | |
|
Возможно какой-то прикол из-за конфликта перемещающих конструкторов С++14 с указателями. Теоретически должна помочь обёртка указателя в класс.
Добавлено через 6 минут или попробовать другую версию компилятора
0
|
|
|
77 / 50 / 16
Регистрация: 17.05.2015
Сообщений: 262
|
||
| 23.11.2017, 09:50 | ||
|
Но вообще, архитектура программы в целом не очень хорошая. Как я сказал - за место контейнера с удаляемыми объектами - можно хранить состояние обьекта и это состояние проверять при переборе. За место вектора - лист и тем самым, нам не надо юзать erase. В добавок у листа инсерт в середину по итератору мгновенный. Да и вообще, за место сортировки можно с конца перебирать лист и вставлять новый обьект в нужную позицию по условию. Тогда у тебя контейнер почти всегда отсортированный будет.
0
|
||
| 23.11.2017, 09:50 | |
|
Помогаю со студенческими работами здесь
50
Как изменять размер std::vector<std::vector>? Std::vector<std::pair<std::vector<int>::iterator, std::vector<int>::iterator>
Реализация класса MyString. Стандартная библиотека, std::string, std::vector Передача функции указатель на элемент std::vector<std::string> Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях.
Задача: при копировании документа очищать определенные реквизиты и табличную. . .
|
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git
main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели
8ATzM_2aurI
|
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2.
Задача: запретить редактирование документа, если он открыт у другого пользователя.
/ / . . .
|
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои.
А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
|
|
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20%
kYBz3eJf3jQ
|
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
|
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
|
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора
Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2.
Задача: уведомлять пользователя, если. . .
|