【问题标题】:Program received signal SIGSEGV, Segmentation fault程序接收信号 SIGSEGV,Segmentation fault
【发布时间】:2011-08-16 22:20:11
【问题描述】:

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

};

顺便说一句...函数调用是由一个孩子调用的,虽然我不明白这会如何导致问题。

【问题讨论】:

  • 另外...它在以前的迭代中运行没有错误...它只是不喜欢这个迭代...我会链接代码但是那里有一堆东西 X(
  • 我不认为你的问题是那个功能。您可能想看看您是如何创建/访问正在使用的人员对象的。
  • 您的代码示例没问题,段错误是在其他地方引起的。请使用调试器单步调试您的代码,以找到导致错误的代码行。
  • 嗯,你是说那个字符串“正在调试的程序......”是那个变量的内容吗?很奇怪。你能告诉我们故障出在哪一行代码吗?使用 -g 构建程序(如果使用 GCC),然后在 GDB 中运行它。它将因错误而中断。如果您不知道自己在哪里,请输入bt,它将显示函数调用堆栈。查找堆栈,直到找到一些代码——即出现错误的那一行。
  • @mgiuca:确切地说,这与症状相符。实际错误可能在其他地方。

标签: c++ signals segmentation-fault


【解决方案1】:

很可能,您正在解除对恶意指针的引用。通过纯粹的猜测,你有没有这样的东西,也许:

 Person persons[10];

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

问题可能是:

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

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

自我提醒:我为什么要这样做/我不是通灵者?

【讨论】:

    【解决方案2】:

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

    $ valgrind myprogram
    

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

    PS。它与“flint”押韵,而不是“find”。

    【讨论】:

    • +1 用于正确发音 valgrind ('valgreend')
    【解决方案3】:

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

    void setName(string newName);
    

    应该是

    void setName(const string& newName);
    

    问题一定出在方法调用上。

    【讨论】:

    • -1:您只说“看起来不错”,没有任何解决问题的尝试。您提供的小细节大多无关紧要,因为字符串是否被复制一次或两次在这里不会产生任何影响。充其量,您的帖子应该是对原始问题的评论。很可能您没有制作 cmets 所需的分数,只需尝试实际回答以获得一些分数 - 但要合理地做。这个问题(以及你的答案)缺乏细节,将来不太可能帮助任何人。您极不可能在这篇文章中得分,并且带有评论性答案。
    • "问题一定出在方法调用上。"意味着代码很差,但没有错误。
    猜你喜欢
    • 1970-01-01
    • 2021-01-16
    • 2021-08-13
    • 1970-01-01
    • 2016-08-19
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    相关资源
    最近更新 更多