2011-05-02 64 views
7

好吧...我撕扯我的頭髮......爲什麼我會得到分割fauls當我路過一個叫「名」的內容是「喬爾」串入計劃接收信號SIGSEGV,分割過錯

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; 

}; 

順便說一句...函數調用是一個孩子,但我不明白怎麼會引起問題。

+0

另外...它運行在以前的無故障...它只是不喜歡這個迭代...我會鏈接的代碼,但它的桶X的東西( – falconmick 2011-05-02 11:34:38

+1

我不認爲你的問題是這個功能。你可能想看看你是如何創建/訪問你正在使用的人物對象的。 – 2011-05-02 11:35:34

+0

你的代碼示例是正常的,segfault是在其他地方引起的。請使用調試器遍歷代碼以找到代碼行導致錯誤 – 2011-05-02 11:36:53

回答

1

也許,您正在提領一個流氓指針。純屬猜測,你有這樣的事情,也許是:

Person persons[10]; 

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

的問題可能是:

  • 像顯示的錯誤,該指數是基於0的,所以你需要for (i=0; i<10; i++)
  • 如果數組是動態分配的,但索引仍然超出範圍

有幾百個其他原因,但由於我沒有你的代碼,這是我的試圖猜測最可能的錯誤;)

注意自我:爲什麼我這樣做/我不是精神病?

17

如果您在Linux上,請嘗試運行valgrind。你只是-g(用gcc)編譯,然後用valgrind在前面運行程序:

$ valgrind myprogram 

與海灣合作委員會的解決方案,它告訴你什麼時候該段錯誤發生時,的valgrind通常會告訴你什麼時候第一個內存破壞發生,所以你可以更接近問題的來源。

PS。它用「燧石」押韻,而不是「發現」。

+2

+1給valgrind('valgreend')的正確發音 – 2012-09-28 15:36:31

-2

除了您始終複製字符串的事實外,代碼看起來很好。取而代之的

void setName(string newName); 

應該

void setName(const string& newName); 

問題必須在方法調用。

+0

-1:你只說「看起來不錯」而沒有任何解決問題的嘗試。你提供的小細節大多是不相關的,因爲字符串是否被複制一次或兩次不應該在這裏產生任何影響。充其量,你的文章應該是對原始問題的評論。很可能你沒有評論所需的要點,只是試着回答一些分數 - 但要合理地做。這個問題(也是你的答案)缺乏細節,在未來很難幫助任何人。你不太可能在這篇文章中得分,並有評論答案。 – quetzalcoatl 2014-07-17 15:20:19

+0

「問題必須在方法調用中。」這意味着代碼很差,但沒有錯誤。 – user3849792 2014-11-17 12:42:35

相關問題