2011-05-02 29 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

相关问题