#c #vector #segmentation-fault
#c #вектор #ошибка сегментации
Вопрос:
Итак, у меня есть довольно простой класс, в котором есть несколько методов и некоторые переменные класса. Все работает отлично, пока я не добавлю вектор к переменным-членам в файле заголовка:
std::vector <std::string> vectorofstuff;
Если все, что я делаю, это добавляю эту строку, тогда моя программа работает отлично, но в конце, после того, как все выходные данные есть, я получаю сообщение о сбое в сегменте.
Мое первое предположение заключается в том, что мне нужно вызвать деструктор для вектора, но, похоже, это не сработало. Кроме того, я понимаю, что мне не нужно вызывать деструктор, если я не использую слово «новый».
Любые толчки в правильном направлении? Спасибо, пучки!
Комментарии:
1. Пожалуйста, опубликуйте свой фактический код. Объявление вектора не является проблемой. Возможно, вы сможете решить эту проблему, используя <a href=» valgrind valgrind.org /»>valgrind</a > (если вы используете платформу, которая его поддерживает).
2. Вам никогда не нужно вызывать деструктор самостоятельно, и я имею в виду никогда , если вы не сделали что-то, называемое «новым на месте», чего, я могу заверить, вы не делали. Очевидно, что в этой строке нет ничего плохого, вам нужно будет использовать больше кода. Опубликуйте минимальный объем кода, который воспроизводит эту проблему.
3. Вероятно, ваша реальная проблема заключается не в векторе, поскольку вы не изменяли
std::string
std::vector
класс or, а скорее в другой проблеме, которая была замаскирована, пока вы не сделали класс, содержащийsumofurls
больший. Попробуйте запустить программу в отладчике и посмотреть, где вы получаете ошибку segfault, имея в виду, что проблема могла быть вызвана более ранним повреждением памяти.4. Тьфу, извините, я забыл, что вы должны публиковать ссылки, подобные этой: valgrind
5. @InBetween: возможно, ваш makefile поврежден (проверьте зависимости для каждой единицы компиляции …)
Ответ №1:
Я предполагаю, что с вами либо произошло следующее, либо это было что-то подобное, связанное с нереализованными зависимостями / заголовками. В любом случае, я надеюсь, что этот ответ может появиться в Google и помочь некоторым более поздним, крайне запутанным программистам понять, почему они внезапно наблюдают произвольные сбои.
Итак, по опыту, это может произойти, если вы скомпилируете новую версию SomeObject.o
, но случайно получили другой объектный файл #include
старой версии SomeObject.hpp
. Это приводит к повреждению, которое будет вызвано тем, что компилятор ссылается на устаревшие смещения элементов и т. Д. Иногда это в основном работает и приводит к сбоям сегментации только при уничтожении объектов — связанных или, казалось бы, удаленных, — а в других случаях программа отключается сразу или где-то посередине; Я видел несколько перестановок (к сожалению!).).
Для тех, кто интересуется, почему это может произойти, возможно, это просто отражение того, как мало я сплю во время программирования, но я столкнулся с этим шаблоном в контексте подмодулей Git, например:
MyRepo
- /
GuiSubmodule
- /
HelperSubmodule
- / /
GuiSubmodule
Если (А) у вас есть новый коммит GuiSubmodule
, который еще не был перенесен в HelperSubmodule
копию, (Б) ваши makefile
компиляции MyRepo/uiSubmodule/SomeObject.o
и (В) другая единица перевода — либо в подмодуле, либо в основном репозитории через #include
ссылки на более старую версию SomeObject.hpp
, которая имеет другуюмакет класса… Вы весело проводите время и много гоняетесь за отвлекающими маневрами, пока, наконец, не осознаете простую ошибку.
Поскольку я собрал свой процесс сборки с нуля, я, возможно, просто неправильно использовал Git / make
или достаточно строго (забыв нажать / вытащить все подмодули). Вероятно, последнее! По крайней мере, в наши дни я вижу меньше странных ошибок 🙂
Ответ №2:
Вероятно, вы повреждаете память vectorofstuff
элемента где-то в вашем классе. При вызове деструктора класса также вызывается деструктор вектора, который попытается указать и / или удалить недопустимую память.
Комментарии:
1. Я вообще ничего не добавлял в vectorofstuff, не трогал его, просто добавил эту строку в свой файл .h . Как бы я повредил vectorofstuff? (Я не пытаюсь казаться саркастичным, мне честно интересно, ха-ха)
2. @InBetween: например, при попытке записи в статический массив в пределах того же класса и невозможности работать в его пределах. Или даже более тупые вещи, такие как вызов
memset( this, 0, sizeof( *this )
(поверьте мне, я их видел)…
Ответ №3:
Я дурачился с этим и решил, просто чтобы быть уверенным, выполнить rm для всего и перекомпилировать. И угадайте, что? Это исправлено. Я понятия не имею, почему, в makefile я все равно это делаю, но как бы то ни было, я просто рад, что могу двигаться дальше и продолжать работать над этим. Большое спасибо за всю помощь!
Комментарии:
1. Я думаю, что это поддерживает предыдущий комментарий @Benoit и мой (сильно запоздалый) ответ, поскольку, похоже, это было вызвано тем, что некоторые заголовочные / объектные файлы не согласны с макетом класса или аналогичными. Тогда это эффективно UB, поскольку некоторые части кода могут в конечном итоге читать / записывать в настоящее время — неправильные смещения объектов и т.д. Рад, что вы разобрались! Я тоже … в конце концов 😉