程序接收信号SIGSEGV,分段故障

时间:2011-05-02 11:33:11

标签: c++ segmentation-fault signals sigsegv

好的......我正在扯掉我的头发...当我传递一个名为“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;

};

btw ...函数调用是由孩子进行的,虽然我不知道这可能会导致问题。

3 个答案:

答案 0 :(得分:18)

如果您使用的是Linux,请尝试运行valgrind。您只需使用-g(使用gcc)进行编译,然后在前面使用valgrind运行您的程序:

$ valgrind myprogram

与GCC解决方案不同,它告诉您何时发生段错误,valgrind通常会告诉您第一次发生内存损坏的确切时间,因此您可以更接近其来源捕获问题。

PS。它与“燧石”押韵,而不是“发现”。

答案 1 :(得分:1)

可能你正在取消引用一个流氓指针。通过纯粹的猜测,你有这样的事情,或许:

 Person persons[10];

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

问题可能是:

  • 如图所示的错误,索引从0开始,因此您需要for (i=0; i<10; i++)
  • 如果数组是动态分配的,但索引仍然超出范围

实际上可能有数百个其他原因,但由于我没有你的代码,这是我试图猜测最合理的错误;)

自我注意:为什么我这样做/我不是通灵者?

答案 2 :(得分:-2)

除了一直复制字符串这一事实外,代码看起来还不错。而不是

void setName(string newName);

应该是

void setName(const string& newName);

问题必须在方法调用中。