使用= overload函数时析构函数中的异常

时间:2015-05-05 14:55:04

标签: c++ exception destructor

我有一个多项式类。 +重载的功能有效,但由于异常,我无法使用=重载功能! 我调试了程序,看到异常是在析构函数中,我不知道如何解决它!

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;
    }

1 个答案:

答案 0 :(得分:1)

看看这段代码: 多项式tmp(p); 。 当tmp超出范围时,它被删除并且为它调用析构函数。所以正在调用 delete [] coeff; ,删除你在堆上分配的系数。你应该在你的任务操作员中做的是:

  1. 删除[] coeff
  2. 将p.maxPoly分配给maxPoly
  3. 为新系数分配内存。 coeff = new double [maxPoly]
  4. 将所有系数复制到新阵列。像那样

    for(int i = 0; i&lt; maxPoly; ++ i)coeff [i] = p.coeff [i];

  5. 那应该没事。

    在您的实现中,您似乎遇到了复制构造函数的麻烦。你定义了吗?如果没有,你应该这样做,因为在堆上分配的内存不会在标准拷贝构造函数中自动复制。