【问题标题】:Exception in destructor while using = overload function [closed]使用=重载函数时析构函数中的异常[关闭]
【发布时间】:2015-07-15 09:24:12
【问题描述】:

我有一个多项式课程。 + 重载函数有效,但由于异常,我无法使用 = 重载函数! 我调试了程序,发现异常在析构函数中,我不知道如何修复它!

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

【问题讨论】:

  • 有什么异常?
  • 我认为你很可能delete 两次相同的内存。所以问题实际上不在析构函数中,而是在你的复制构造函数中。
  • @Anton:我添加了构造函数和复制构造函数。有什么问题?
  • 我们是否必须猜测异常是什么?

标签: c++ exception destructor


【解决方案1】:

看看这段代码: 多项式 tmp(p);。 当 tmp 超出范围时,它将被删除并调用析构函数。所以 delete[]coeff; 被调用,删除你的 coeff,分配在堆上。你应该在你的赋值运算符中做的是:

  1. 删除[]系数
  2. 将 p.maxPoly 分配给 maxPoly
  3. 为新的系数分配内存。 coeff = new double[maxPoly]
  4. 将所有系数复制到新数组中。就这样

    for(int i = 0; i

应该没问题。

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

【讨论】:

  • 我在赋值运算符函数中执行第 2 步和第 4 步:std::swap(maxPoly, tmp.maxPoly);标准::交换(系数,tmp.coeff);并在复制构造函数中分配内存。有错吗?
  • 请提供您的复制构造函数的代码
  • 我编辑了问题并添加了我的复制构造函数的代码。
  • 他应该做的不是这些,而是​​简单地使用std::vector
  • @Puppy:我不使用 stdd::vector
猜你喜欢
  • 1970-01-01
  • 2012-04-15
  • 2013-11-07
  • 1970-01-01
  • 2017-08-16
  • 2014-01-21
  • 2012-04-11
  • 2012-10-28
  • 2013-08-13
相关资源
最近更新 更多