Программа получила сигнал SIGSEGV, ошибка сегментации - PullRequest
8 голосов
/ 02 мая 2011

Хорошо ... Я вырываю свои волосы ... Почему у меня возникают ошибки сегментации, когда я передаю строку с именем "name" с содержанием "joel" в

void person::setName(string newName)
{
    personName = newName;
}

Заголовочный файл:

class person {
public:
    int getID();
    string getName();

    void setID(int newID);
    void setName(string newName);
private:
    int personID;
    string personName;

};

Кстати ... вызов функции осуществляется ребенком, хотя я не понимаю, как это может вызвать проблему.

Ответы [ 3 ]

18 голосов
/ 02 мая 2011

Если вы работаете в Linux, попробуйте запустить valgrind .Вы просто компилируете с -g (с gcc), а затем запускаете свою программу с valgrind впереди:

$ valgrind myprogram

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

PS.Рифмуется с «кремнем», а не с «найти».

1 голос
/ 02 мая 2011

Возможно, вы разыменовываете указатель мошенника.Чисто догадываясь, у вас есть что-то вроде этого, возможно:

 Person persons[10];

 for (i=1; i<=10; i++)
     persons[i].setName("joel");

Проблема может быть:

  • ошибка, как показано, индекс основан на 0, поэтому вынужно for (i=0; i<10; i++)
  • , если массив выделяется динамически, но индекс все еще находится за пределами

Там могут быть буквально сотни других причин, но так как у меня нетВаш код, это моя попытка угадать наиболее вероятные ошибки;)

( Примечание для себя: почему я это делаю / я не экстрасенс? )

0 голосов
/ 17 июля 2014

Код выглядит хорошо, если не считать того, что вы копируете строку все время.Вместо

void setName(string newName);

должно быть

void setName(const string& newName);

Проблема должна быть в вызове метода.

...