使用 = 重载函数时析构函数中出现异常
Exception in destructor while using = overload function
我有多项式的class。 + 重载的功能有效,但由于异常我无法使用 = 重载功能!
我调试了程序,看到异常在析构函数中,我不知道如何解决!
polynomial::~polynomial()
{
delete[] coeff;
}
const polynomial& polynomial::operator=(const polynomial& p)
{
if(this == &p)
return *this;
polynomial tmp(p);
std::swap(maxPoly, tmp.maxPoly);
std::swap(coeff, tmp.coeff);
return *this;
}
void polynomial::add(const polynomial& aPoly)
{
if(aPoly.maxPoly > maxPoly)
grow(aPoly.maxPoly);
for(int i = 0; i < (int) maxPoly; i++)
coeff[i] += aPoly.coeff[i];
}
polynomial::polynomial()
{
coeff = new int[10];
for (int i = 0; i < 10; i++)
{
coeff[i] = 0;
}
maxPoly = 10;
}
polynomial::polynomial(int size){
coeff = new int[size];
for (int i = 0; i < size; i++)
{
coeff[i] = 0;
}
maxPoly = size;
}
polynomial::polynomial(const polynomial& aPoly)
{
coeff = new int[aPoly.maxPoly];
for (int i = 0; i < aPoly.maxPoly; i++)
{
coeff[i] = aPoly.coeff[i];
}
maxPoly = aPoly.maxPoly;
}
看这段代码:
多项式 tmp(p);。
当 tmp 超出范围时,它将被删除并调用析构函数。所以 delete[]coeff; 被调用,删除你的 coeff,分配在堆上。你应该在赋值运算符中做的是:
- 删除[]系数
- 将 p.maxPoly 分配给 maxPoly
- 为新系数分配内存。 coeff = new double[maxPoly]
将所有系数复制到新数组。那样
for( int i = 0; i < maxPoly; ++i )coeff[i] = p.coeff[i];
应该没问题。
在您的实现中,您似乎遇到了复制构造函数的问题。你定义了吗?如果没有,您应该这样做,因为在标准复制构造函数中不会自动复制在堆上分配的内存。
我有多项式的class。 + 重载的功能有效,但由于异常我无法使用 = 重载功能! 我调试了程序,看到异常在析构函数中,我不知道如何解决!
polynomial::~polynomial()
{
delete[] coeff;
}
const polynomial& polynomial::operator=(const polynomial& p)
{
if(this == &p)
return *this;
polynomial tmp(p);
std::swap(maxPoly, tmp.maxPoly);
std::swap(coeff, tmp.coeff);
return *this;
}
void polynomial::add(const polynomial& aPoly)
{
if(aPoly.maxPoly > maxPoly)
grow(aPoly.maxPoly);
for(int i = 0; i < (int) maxPoly; i++)
coeff[i] += aPoly.coeff[i];
}
polynomial::polynomial()
{
coeff = new int[10];
for (int i = 0; i < 10; i++)
{
coeff[i] = 0;
}
maxPoly = 10;
}
polynomial::polynomial(int size){
coeff = new int[size];
for (int i = 0; i < size; i++)
{
coeff[i] = 0;
}
maxPoly = size;
}
polynomial::polynomial(const polynomial& aPoly)
{
coeff = new int[aPoly.maxPoly];
for (int i = 0; i < aPoly.maxPoly; i++)
{
coeff[i] = aPoly.coeff[i];
}
maxPoly = aPoly.maxPoly;
}
看这段代码: 多项式 tmp(p);。 当 tmp 超出范围时,它将被删除并调用析构函数。所以 delete[]coeff; 被调用,删除你的 coeff,分配在堆上。你应该在赋值运算符中做的是:
- 删除[]系数
- 将 p.maxPoly 分配给 maxPoly
- 为新系数分配内存。 coeff = new double[maxPoly]
将所有系数复制到新数组。那样
for( int i = 0; i < maxPoly; ++i )coeff[i] = p.coeff[i];
应该没问题。
在您的实现中,您似乎遇到了复制构造函数的问题。你定义了吗?如果没有,您应该这样做,因为在标准复制构造函数中不会自动复制在堆上分配的内存。