解决分段故障(核心转储)错误

时间:2021-03-12 10:59:13

标签: c++

此程序将给定的帐号的每秒整数加倍,如果数字大于 10,则减去 9。然后输出输入的数字是否正确。假设帐号是关闭 5 个数字。我写了这个程序,但没有得到几个数字的答案,但得到了其他数字的正确答案。谢谢提示。

#include <iostream>

class AccountNumber {

private:
  int size = 5;

  int *p;

public:
  AccountNumber() { int *p = new (std::nothrow) int[size]; }

  ~AccountNumber() { delete[] p; }

  void getaccount() {
    int acc;
    std::cout << "Enter the account number: ";
    std::cin >> acc;
    for (int i = 0; i < size; i++) {
      p[i] = acc % 10;
    }
    setaccount(p);
  }

  void setaccount(int a[]) {
    for (int i = 0; i < size; i++) {
      p[i] = a[i];
    }
  }

  void doubles() {
    AccountNumber at;
    at.p = new int[size];
    at.p = p;
    for (int i = 0; i < size; i++) {
      if (i % 2 == 1) {
        at.p[i] = at.p[i] * 2;
        if (at.p[i] > 10) {
          at.p[i] = at.p[i] - 9;
        }
      }
    }
    p = at.p;
  }

  bool sum() {
    bool ot;
    int sum = 0;
    for (int i = 0; i < size; i++) {
      sum = sum + p[i];
    }
    int mod = sum % 10;
    if (mod == 0) {
      ot = true;
    } else {
      ot = false;
    }
    return ot;
  }

  void display(std::ostream &outs) {
    bool ot = sum();
    doubles();
    outs << "Account number entered is ";
    if (ot) {
      outs << " correct.\n";
    } else {
      outs << " is not correct. \n";
    }
  }
};

int main(int argc, char const *argv[]) {
  AccountNumber accn;
  accn.getaccount();
  accn.display(std::cout);
  return 0;
}

输出

Enter the account number: 35556
Segmentation fault (core dumped)

我不知道我哪里出错了。

1 个答案:

答案 0 :(得分:2)

这里的问题是您从不分配 p。看看你的构造函数:

AccountNumber() 
{
    int *p = new(std::nothrow) int[size];
}

这里您定义一个指针变量p,它将代替成员指针变量{{ 1}} 您在 p 字段中定义。这里发生的情况是您正在为新变量 private 分配一个 int 数组,但是该变量 p 在构造函数的末尾被抛出(并且还会导致内存泄漏,因为永远不会被回收的动态分配)。

您在这里应该做的只是将新分配的数组分配给成员指针变量 p 而无需重新定义它,

p

为了防止此类错误再次发生,您应该考虑对类成员使用特定的命名约定,例如 AccountNumber() { p = new (std::nothrow) int[size]; } 前缀(例如)

m_