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

纳斯林

我有一类多项式。+重载功能正常工作,但由于异常,我无法使用=重载功能!我调试了程序,发现析构函数中有异常,我不知道该如何解决!

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;
    }
亚历山大·拉彭科夫(Alexander Lapenkov)

看下面的代码:多项式tmp(p); 当tmp超出范围时,它将被删除,并为此调用析构函数。所以删除[] coeff; 被调用,删除您的coeff,分配在堆上。您应该在赋值运算符中执行以下操作:

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

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

那应该没问题。

似乎在您的实现中,您在使用复制构造函数时遇到了麻烦。您定义好了吗?如果不是,则应执行此操作,因为在标准副本构造函数中不会自动复制在堆上分配的内存。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用析构函数= delete;

何时使用虚拟析构函数?

使用Vector创建对象时如何调用析构函数

使用析构函数进行线程连接

隐式使用析构函数

使用析构函数进行工作

C ++使用RAII与引发的析构函数

当基类的成员的析构函数具有非空的no指定符和主体时,在析构函数上使用C2694

正确使用析构函数

使用受保护的非虚拟析构函数时禁止删除非虚拟dtor警告

在析构函数中引发异常时,为什么不调用重载的删除?

使用std :: function作为成员函数,该函数捕获`this`,并在析构函数之后从复制的lambda中对其进行访问

使用析构函数分离事件

使用std :: map时,包含unique_ptr的结构中的默认析构函数会导致编译错误

在使用仅移动类型派生的类中定义析构函数时,使用std :: vector的emplace_back或push_back创建时会产生编译时错误

如果我还使用复制构造函数和重载=运算符,是否需要析构函数?

为什么在使用赋值时不调用析构函数的堆栈变量?

为什么在使用unique_ptr时没有调用析构函数?

当调用析构函数时,此示例中使用了什么?

重载delete []运算符,以允许使用析构函数缩小类型的数组

如何释放正在返回的变量所占用的内存(使用C ++,在类中,使用析构函数)?

使用析构函数时清除成员变量

为什么在VC中,“ delete”和“ delete []”都使用标量删除析构函数?

当我使用 dynamic_cast 并删除对象 delete 时,析构函数如何工作?

使用 PPL 时是否需要将析构函数与异步函数同步?

类中的析构函数在使用类时不断调用它自己

c++ 使用链表时的析构函数段错误

使用 Python 的析构函数中的分段错误

在 Visual Studio 中使用指针时析构函数崩溃