【发布时间】:2016-03-09 19:27:42
【问题描述】:
所以我试图为我的多项式数组重载运算符 +,我不断收到 _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) 错误(第 52 行),我不知道为什么。 问题一定出在我重载 operator+ 的方式上,因为没有它就不会发生。
class Polynomial
{
public:
int compo;
int expo;
int size; // array size + largest exponent
friend ostream &operator<<(ostream&, const Polynomial &);
friend istream &operator>>(istream&, Polynomial &);
int* arr;
Polynomial();
Polynomial(int);
Polynomial(const Polynomial&);
~Polynomial();
int getSize();
Polynomial operator+(const Polynomial &);
private:
};
...
Polynomial Polynomial::operator+(const Polynomial &p)
{
Polynomial p1;
for (int i = 0; i < p1.size; i++)
{
p1.arr[i] = arr[i] + p.arr[i];
}
return p1;
}
main(仅用于检查发生了什么):
int main()
{
Polynomial p;
p.arr[2] = 4;
p.arr[0] = 4;
cout << p;
cout << "Enter compo, expo:\n";
cin >> p;
Polynomial z;
z = z + p;
cout << z;
return 0;
}
构造函数:
Polynomial::Polynomial()
{
size = 100;
arr = new int[size];
}
Polynomial::Polynomial(int a)
{
size = a;
arr = new int[size];
}
复制构造函数:
Polynomial::Polynomial(const Polynomial& p)
{
arr = p.arr;
size = p.size;
}
析构函数:
Polynomial::~Polynomial()
{
delete[] arr;
}
辛:
istream &operator>>(istream &input, Polynomial &p)
{
input >> p.compo;
input >> p.expo;
if (p.expo > p.size+1)
{
int *temp;
p.size = p.expo + 1;
temp = new int[p.expo + 1];
for (int i = 0; i < p.expo+1; i++)
{
temp[i] = p.arr[i];
}
delete[] p.arr;
p.arr = temp;
}
p.arr[p.expo] = p.compo;
return input;
}
【问题讨论】:
-
你能展示你的构造函数吗?你是怎么分配
p.arr的? -
内存管理失败。您可以将
int* arr;替换为std:::vector<int> arr(并去掉int size;) -
我们还没有学习矢量所以我不能使用它们:|
-
在
operator+中,您正在创建默认的Polinomial对象(如何完成创建 - 我们不知道),并且在立即 for 循环中,您正在循环它的大小(完全忽略你的论点的大小,可能超出他们的界限)。那么,这些对象是如何构造的呢?它们是如何复制构建的? -
因此,由于您没有在示例中创建具有自定义大小的
Polynomial,因此这不是导致崩溃的原因,但仍然是一个问题,需要修复乙>。我想看看,您的Polynomial对象的复制构造/破坏情况如何。