Ошибка сегментации при добавлении вектора. (C )

#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, поскольку некоторые части кода могут в конечном итоге читать / записывать в настоящее время — неправильные смещения объектов и т.д. Рад, что вы разобрались! Я тоже … в конце концов 😉