我正在编写一个程序来计算一个点的多项式。我使用霍纳的方案。像往常一样,我分配内存。在分配内存的时候,除了构造函数,我把析构函数和赋值运算符写出来,还使用引用来避免创建对象的副本。一切似乎都是合法的。但最后程序输出 free(): invalid pointer。大概又错过了什么。你能告诉我哪里出了问题吗?
#include<iostream>
using namespace std;
class Polynom{
int x, n, *data, result;
public:
Polynom(){
x = 0; n = 0;
}
Polynom(int N, int X){
n = N;
x = X;
data = new int[n];
}
~Polynom(){
delete[] data;
}
void scan(){
cout << "Input coeff:"<<endl;
for(int i = 0; i < n; i++){
cin >> data[i];
}
}
void print(){
cout << result;
}
Polynom &operator =(const Polynom &ob){
if(this == &ob) return *this;
if(data) delete[] data;
n = ob.n;
x = ob.x;
data = new int[n];
for(int i = 0; i < n; i++)
data[i] = ob.data[i];
return *this;
}
int poli(){
result = data[0];
for(int i = n-1; i > 0; i--){
result=result*x + data[i];
}
return result;
}
friend Polynom operator -=(const Polynom &ob1, const Polynom &ob2);
};
/*Polynom operator -=(const Polynom &ob1, const Polynom &ob2){
Polynom temp;
ob1.data[i] -= ob2.data[i];
return temp;
}
*/
int main(){
int n, x;
cout << "Input n and x:";
cin >> n >> x;
Polynom ob1(n,x), ob2;
ob1.scan();
ob1.poli();
}
构造函数中没有为对象分配内存
Polynom ob2;
,指针也没有设置为零,调用析构函数时,调用delete[] data;
非空指针的命令。原则上应该可以解决问题,因为 现在
delete
可以正确处理空指针:嗯,还是手动check in destructor
在正常情况下,您还需要检查是否将正确的参数传递给构造函数
n > 0
。否则,您可能会遇到同样的问题——内存未分配,您尝试删除它。复制构造函数也是如此。然后
delete[]
重新设置指针,因为不知道能不能new()
分配内存。一般来说,为了让对象的状态保持正确,最好先分配内存给一个临时指针,如果一切顺利,才删除旧内存。如果您自己编写了一个构造函数,那么您必须遵循五个规则。您还需要添加一个移动构造函数和一个移动赋值。