Thắc mắc về delete mảng động trong c++

Mọi người cho em hỏi em có làm một bài tập về OOP
Nhưng tới lúc chạy thì lại bị lỗi ở đoạn giải phóng của mảng động.
Mọi người cho em hỏi nguyên nhân gây ra lỗi và cách giải quyết với ạ.
Em cảm ơn!

Đây là code của em:

#include <iostream>
#include <cmath>
using namespace std;

class donthuc
{
private:
	double heso;
	int somu;
public:
	donthuc(double x = 0, int y = 0) : heso(x), somu(y) {}
	~donthuc() {}
	void nhap();
	void xuat();
	void setHS(double x = 0) { heso = x; }
	void setSM(int y = 0) { somu = y; }
	double getHS() { return heso; }
	int getSM() { return somu; }
	donthuc cong(donthuc a);
	donthuc tru(donthuc a);
};

class dathuc
{
private:
	donthuc* a;
	int maxSOMU;
public:
	dathuc() {};
	dathuc(int n) : maxSOMU(n) {}
	~dathuc();
	void nhap();
	void xuat();
	double getHESO(int i) { return a[i].getHS(); }
	void setHESO(int i, int n = 0) { a[i].setHS(n); a[i].setSM(i); }
	dathuc cong(dathuc);
	dathuc cong(donthuc);
	dathuc tru(dathuc);
	dathuc tru(donthuc);
};

int main()
{
	donthuc a;
	dathuc b;
	dathuc c;
	a.nhap();
	b.nhap();
	c = b.cong(a);
	c.xuat();
	cout<<endl;
	c = b.tru(a);
	c.xuat();
	c.xuat();
	system("pause");
	return 0;
}

//donthuc

void donthuc::nhap()
{
	cout<<"Nhap so mu don thuc: ";
	cin>>this->somu;
	cout<<"Nhap he so don thuc: ";
	cin>>this->heso;
}
void donthuc::xuat()
{
	if(heso == 0)
		cout<<0;
	else
	{
		if(somu == 0)
		    cout<<heso<<" ";
		else if(somu == 1)
			cout<<heso<<"x"<<" ";
		else 
			cout<<heso<<"x^"<<somu<<" ";

	}
}
donthuc donthuc::cong(donthuc z)
{
	donthuc c;
	if(this->somu == z.somu)
	   c.heso = this->heso + z.heso;
	return c;
}
donthuc donthuc::tru(donthuc z)
{
	donthuc c;
	if(this->somu == z.somu)
	   c.heso = this->heso - z.heso;
	return c;
}

//dathuc
dathuc::~dathuc()
{
	if(this->a != NULL)
		delete[] this->a;
}
void dathuc::nhap()
{
	cout<<"Nhap vao so mu lon nhat: ";
	cin>>this->maxSOMU;
	a = new donthuc[maxSOMU];
	for(int i = 0; i <= this->maxSOMU; i++)
	{
		double n;
		cout<<"Nhap he so cua so mu "<<i<<endl;
		cin>>n;
		this->a[i].setHS(n);
		this->a[i].setSM(i);
	}
}
void dathuc::xuat()
{
	cout<<a[0].getHS();
	for(int i = 1; i <= this->maxSOMU; i++)
	{
		if(a[i].getHS() > 0)
		{
			cout<<"+";
		    a[i].xuat();
		}
		else
		{
		    a[i].xuat();
		}
	}
}
dathuc dathuc::cong(dathuc z)
{
	int max = (this->maxSOMU > z.maxSOMU) ? this->maxSOMU : z.maxSOMU;
	int min = (this->maxSOMU < z.maxSOMU) ? this->maxSOMU : z.maxSOMU;
	dathuc g(max);
	g.a = new donthuc[max+ 1];
	for(int i = 0; i <= max; i++)
	{
		g.a[i] = this->a[i].cong(z.a[i]);
		g.a[i].setSM(i);
	}
	return g;
}
dathuc dathuc::cong(donthuc z)
{
	dathuc g(this->maxSOMU);
	g.a = new donthuc[g.maxSOMU + 1];
	for(int i =0; i<= this->maxSOMU; i++)
	{
		g.a[i].setHS(this->a[i].getHS());
		g.a[i].setSM(this->a[i].getSM());
	}
	for(int i = 0; i <= this->maxSOMU; i++)
	{
		if( i == z.getSM())
		{
			g.a[i] = this->a[i].cong(z);
			g.a[i].setSM(i);
			break;
		}
	}
	return g;
}
dathuc dathuc::tru(dathuc z)
{
	int max = (this->maxSOMU > z.maxSOMU) ? this->maxSOMU : z.maxSOMU;
	int min = (this->maxSOMU < z.maxSOMU) ? this->maxSOMU : z.maxSOMU;
	dathuc g(max);
	g.a = new donthuc[max+ 1];
	for(int i = 0; i <= max; i++)
	{
		g.a[i] = this->a[i].tru(z.a[i]);
		g.a[i].setSM(i);
	}
	return g;
} 
dathuc dathuc::tru( donthuc z)
{
	dathuc g(this->maxSOMU);
	g.a = new donthuc[g.maxSOMU + 1];
	for(int i =0; i<= this->maxSOMU; i++)
	{
		g.a[i].setHS(this->a[i].getHS());
		g.a[i].setSM(this->a[i].getSM());
	}
	for(int i = 0; i <= this->maxSOMU; i++)
	{
		if( i == z.getSM())
		{
			g.a[i] = this->a[i].tru(z);
			g.a[i].setSM(i);
			break;
		}
	}
	return g;
}

Và đây là đoạn báo lỗi:

dathuc::~dathuc()
{
	if(this->a != NULL)
		delete[] this->a;
}
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?