此程序将给定的帐号的每秒整数加倍,如果数字大于 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)
我不知道我哪里出错了。
答案 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_