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

lvmkulzt  于 2023-04-13  发布在  其他
关注(0)|答案(4)|浏览(234)

好吧……我要抓狂了……当我把一个名为“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;

};

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

pxyaymoc

pxyaymoc1#

如果你在Linux上,试着运行valgrind。你只需要用-g(带gcc)编译,然后用valgrind运行你的程序:

$ valgrind myprogram

与GCC解决方案不同,它会告诉您segfault何时发生,valgrind通常会告诉您第一次内存损坏发生的确切时间,因此您可以更接近问题的根源。
PS.它和“弗林特”押韵,而不是“找到”。

vs3odd8k

vs3odd8k2#

很可能,你正在解引用一个流氓指针。通过纯粹的猜测,你是否得到了这样的东西,也许:

Person persons[10];

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

问题可能是:

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

实际上可能有数百种其他原因,但由于我没有您的代码,这是我试图猜测最合理的错误;)
(* 自我提示:我为什么要这么做/我不是灵媒?

sf6xfgos

sf6xfgos3#

#include <iostream>

using namespace std;

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

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

};

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

int main() {
  person* obj = new person();
  obj->setName("your name");
  return 0;
}
gorkyyrv

gorkyyrv4#

代码看起来很好,除了你一直在复制字符串的事实。

void setName(string newName);

应该是

void setName(const string& newName);

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

相关问题