Ошибка сегментации при добавлении вектора.(C ++) - PullRequest
2 голосов
/ 03 октября 2011

Итак, у меня есть довольно простой класс, в котором есть несколько методов и несколько переменных класса. Все прекрасно работало до тех пор, пока я не добавил вектор в переменные-члены в заголовочном файле:

std::vector <std::string> vectorofstuff;

Если все, что я делаю, это добавляю эту строку, то моя программа работает отлично, но в конце, после того, как все выходные данные есть, я получаю сообщение об ошибке сегмента.

Мое первое предположение - мне нужно вызвать деструктор для вектора, но, похоже, это не сработало. Кроме того, я понимаю, что мне не нужно называть деструктор, если я не использую слово «новый».

Любые толчки в правильном направлении? Спасибо, связки!

Ответы [ 3 ]

2 голосов
/ 03 октября 2011

Возможно, вы повреждаете память члена vectorofstuff где-то в вашем классе. Когда вызывается деструктор класса, также вызывается деструктор вектора, который попытается указать и / или удалить неверную память.

1 голос
/ 17 февраля 2016

Я полагаю, что с вами произошло следующее, или это было что-то похожее с нереализованными зависимостями / заголовками.В любом случае, я надеюсь, что этот ответ может появиться в Google и помочь некоторым позже, чрезвычайно запутанным программистам выяснить, почему они внезапно наблюдают произвольные сбои.

Итак, по опыту, это может произойти, если вы скомпилируете новыйверсия SomeObject.o, но случайно есть другой объектный файл #include старая версия SomeObject.hpp.Это приводит к повреждению, которое будет вызвано тем, что компилятор ссылается на устаревшие смещения элементов и т. Д. Иногда это в основном работает и приводит к ошибкам сегмента при разрушении объектов - связанных или, казалось бы, удаленных - и в других случаях программные ошибки сразу или где-то еще.между;Я видел несколько перестановок (к сожалению!).

Для всех, кто интересуется , почему это может произойти, может быть, это просто отражение того, как мало я сплю во время программирования, но ясталкивался с этим шаблоном в контексте подмодулей Git, например:

  • MyRepo
  • / GuiSubmdule
  • / HelperSubmodule
  • / / GuiSubmodule

Если (A) у вас есть новый коммит в GuiSubmodule, который еще не вставлен в копию HelperSubmodule, (B) ваш makefile компилирует MyRepoGuiSubmodule / SomeObject.o и (C) другой модуль перевода -либо в подмодуле, либо в главном репо через опасности #include - ссылки на более старую версию SomeObject.hpp с другим макетом класса ... Вы весело проводите время и много гонитесь за краснымсельди, пока вы, наконец, не поймете простую ошибку.

Так как я собрал весь процесс сборки с нуля, я мог просто не использовать Git / make должным образом - или достаточно строго (забывая проУш / тянуть все подмодули).Я подумываю перейти к символическим ссылкам, по крайней мере, на тот момент, когда мои различные подмодули разрабатываются «в рамках» их основного родительского проекта, так что они вынуждены синхронизироваться!

0 голосов
/ 03 октября 2011

Я дурачился с этим и решил, просто чтобы быть уверенным, сделать rm на всем и перекомпилировать. И угадай что? Это исправило это. Я понятия не имею, почему в make-файле я все равно это делаю, но я просто рад, что могу двигаться дальше и продолжать работать над этим. Большое спасибо за помощь!

...