Buongiorno a tutti,
sono alle prese con un problema nella definizione del distruttore di una classe. Non riesco a capire che istruzioni devo dare al distruttore affinchè mi liberi la memoria occupata dall'oggetto senza darmi errore.
questo è quello che mi viene detto dal compilatore:
*** Error in `./a.out': double free or corruption (fasttop): 0x0000000001fd48b0 ***
grazie mille a chiunque proverà ad aiutarmi
#include <iostream>
#include <cmath>
#include<iomanip>//setw(int):regola cifre decimali fixed
#include <cstring>
#include <cstdlib>
#include <fstream>
#include <sstream>
using namespace std;
class matrice
{
int a;//indica dimensione della matrice
double **b;
public:
void diagonalizza(matrice m, matrice b, matrice vett)
{
for(int i=0;i<m.a;i++)
{
for(int j=0;j<m.a;j++)
{
matrice u(m, 1);
matrice ut(m, 1);
if(i!=j)
{
if(fabs(m[i][j])>1e-10)
{
double b=(m[i][i]-m[j][j])/(2*m[i][j]);
double x1=b+sqrt(1+b*b);
double x2=b-sqrt(1+b*b);
double coseno;
double seno;
if(fabs(x1) <= fabs(x2))
{
coseno=1/sqrt(1+x1*x1);
seno=x1/sqrt(1+x1*x1);
}
else
{
coseno=1/sqrt(1+x2*x2);
seno=x2/sqrt(1+x2*x2);
};
if(acos(coseno)> 1e-8)
{
ut[i][i]=coseno;
ut[j][j]=coseno;
ut[i][j]=-seno;
ut[j][i]=seno;
u[i][i]=coseno;
u[j][j]=coseno;
u[i][j]=seno;
u[j][i]=-seno;
m=(ut*m*u);
vett*=u;
u.matrice::~matrice();
ut.matrice::~matrice();//errore
}
}
}
}
}
if(m==b)
{
for(int i=0;i<m.a;i++)
{
for(int j=0;j<m.a;j++)
{
if(fabs(m[i][j])<9.9999e-6)m[i][j]=0;
}
}
for(int i=0;i<m.a;i++)
{
for(int j=0;j<m.a;j++)
{
if(fabs(vett[i][j])<9.9999e-6)vett[i][j]=0;
}
}
cout<<"questa è la matrice diagonalizzata"<<endl<<m<<"e questa è la matrice degli autovettori"<<endl<<vett;
}
else
{
diagonalizza(m,m,vett);
}
}
matrice(const matrice& c)
{
a=c.a;
double** risultato=new double* [a];
for(int i=0;i<a;i++)
{
risultato[i]=new double[a];
for(int j=0;j<a;j++)
{
risultato[i][j]=c.b[i][j];
}
}
b=risultato;
};
~matrice(){delete [] b;}//errore
bool operator==(matrice g)
{
bool d=true;
for(int i=0;i<a;i++)
{
for(int j=0;j<a;j++)
{
if(b[i][j]!=g.b[i][j]){d=false;}
}
}
return d;
}
matrice()
{
cout<< "quale è la dimensione della matrice? ";
cin >> a;
double** d=new double* [a];
for(int i=0;i<a;i++)
{
d[i]=new double[a];
for(int j=0;j<a;j++)
{
cout <<"inserisci il valore in (" <<i+1 <<',' << j+1 << ") ";
cin>>d[i][j];
}
}
b=d;
}
matrice(matrice g, int h)
{
a=g.a;
double** risultato=new double* [a];
for(int i=0;i<a;i++)
{
risultato[i]=new double[a];
for(int j=0;j<a;j++)
{
if(i!=j)
{
risultato[i][j]=0;
}
else
{
risultato[i][j]=h;
}
}
}
b=risultato;
}
double* operator[](int e){return b[e];}
matrice operator*(matrice d)
{
matrice res(d,0);
res.a=a;
double** risultato=new double* [a];
for(int i=0;i<a;i++)
{
risultato[i]=new double[a];
for(int j=0;j<a;j++)
{
risultato[i][j]=0;
}
}
for(int i=0;i<a;i++)
{
for(int j=0;j<a;j++)
{
for(int k=0;k<a;k++)
{
risultato[i][k]+=(b[i][j]*d.b[j][k]);
}
}
}
res.b=risultato;
return res;
}
friend void operator *=(matrice&, matrice);
friend ostream &operator<<(ostream&, matrice);
};
void operator *=(matrice &a, matrice b)
{
a=a*b;
}
ostream &operator<<(ostream& stream, matrice a)
{
for(int i=0;i<a.a;i++)
{
for(int j=0;j<a.a;j++)
{
stream<<a.b[i][j]<<' ';
}
stream<<endl;
}
return stream;
};
int main()
{
matrice m;
matrice vett(m,'a');
m.diagonalizza(m,m,vett);
}