StackOverflow имеет несколько «Что такое ошибка сегментации?»Стиль Q & A:
Что такое ошибка сегментации?
В идеале вы работаете в среде с отладчиком и возможностью поэтапного выполнения кода.или установите точки останова.Это может помочь вам изолировать обстоятельства вашего крушения.У вас уже был номер строки в трассировке стека, который, как мы предполагаем, указывает на курящий пистолет:
cout<<*sit<<endl;
Но если пройти через отладчик, можно ответить на вопросы, например, произойдет ли это в первый раз в цикле... а если нет, то по какому элементу.
ОБНОВЛЕНИЕ : Рассматривая фрагменты этого кода на GitHub (который не включает приведенный выше код),Я вижу, что ConcretePackage::getDependencies()
возвращает набор по значению , а не по ссылке .Это означает, что каждый раз, когда вы звоните участнику, вы получаете новую копию набора.Итераторы из разных контейнеров не должны сравниваться друг с другом, даже если они одного типа:
сравнение итераторов из разных контейнеров
Для решения этой проблемы вы можете изменить:
for(set<string>::iterator sit = pkg->getDependencies().begin();
sit!=pkg->getDependencies().end(); ++sit) { ... }
... в:
set<string> deps = pkg->getDependencies();
for(set<string>::iterator sit = deps.begin(); sit!=deps.end(); ++sit) { ... }
... или вы можете изменить определение getDependencies для возврата ссылки:
set<string>& ConcretePackage::getDependencies() {
return dependencies;
}
ОбучениеПричины сделать это так или иначе оставлены ученику в качестве упражнения.: P
Еще несколько замечаний:
Вам не нужен специальный случай теста для нулевого размера для классов коллекции, которые вы собираетесь использоватьитераторы с.Если набор не содержит элементов, то .begin()
этого набора вернет итератор, равный .end()
.Вышеописанный цикл прекрасно обрабатывает этот случай и немедленно завершается.
Явный вызов operator+
в вашем коде без каких-либо действий с возвращаемым значением предполагает, что у вас, вероятно, есть какая-то побочнаяэффект.Мало кто ожидает, что выражения типа a = b + c
изменятся b
или c
... и одна строка кода, например b->operator+(c);
, предполагает, что вы делаете что-то в этом роде.Хотя технически это возможно, я бы избежал этого.См. Пункт № 2 здесь: Перегрузка оператора
Когда вы публикуете примеры кода, старайтесь, чтобы они были читабельными и не нуждались в большом количестве полос прокрутки для отображения.Разбейте линии, если вы заметили в предварительном просмотре, что в нем размещена длинная горизонтальная полоса прокрутки.Вместо использования отдельных строк для каждой фигурной скобки, поместите их в те же строки, что и условие.(Независимо от того, какое соглашение вы используете в своей кодовой базе, чем короче, тем лучше при обращении за технической помощью в Интернете.)
(Также предоставьте контекст. Если вы не говорите, что этодомашнее задание и собственный дизайн, тогда люди, подобные мне, отправятся на поиски и выяснят, какой менеджер пакетов вы используете. К счастью, я нашел ваш пост programmers.stackexchange.com ...)