Wycieki pamięci - operacje na macierzach - operatory

0

Mam program do operacji na macierzach.
Mam problem z usunięciem pamięci z obiektu, który jest wykorzystywany w operatorze.
Przy takim zapisie operacji dodwania:
Macierz wynik=macierz1+macierz2;
działa mi tylko dodawanie na macierzach kwadratowych, ale już na innych nie i wysypuje się błąd pamieciowy gdy program dojdzie do tej lini.
Ma ktoś jakiś pomysł jak temu zaradzić?

class Macierz
{
private:
	double ** macierz;
	int szer;
	int wys;
public:
	Macierz();
	Macierz(int s, int w);
	Macierz(Macierz & m);
	~Macierz(void);

	Macierz operator+(Macierz & m);

}; 

//PLIK CPP

Macierz::Macierz()
{
}

Macierz::Macierz(int s, int w): szer(s), wys(w)
{
	this->macierz = new double * [szer];
	for(int i=0; i<wys; i++)
		macierz[i]= new double [wys];
}

Macierz::Macierz(Macierz & m) : szer(m.szer), wys(m.wys)
{
	macierz=new double *[m.szer];
	for(int i=0; i<m.wys; i++)
		macierz[i] = new double[m.szer];
	for(int i=0; i<m.szer; i++)
		for(int j=0; j<m.wys; j++)
			macierz[i][j]=m.macierz[i][j];
}

Macierz::~Macierz(void)
{
	for(int x=0; x<szer; x++)
		delete [] macierz[x];
	delete [] macierz;
}

Macierz Macierz::operator+(Macierz & m)
{
	Macierz wynik(szer, wys);
	for(int i=0; i<m.szer; i++)
		for(int j=0; j<m.wys; j++)
			wynik.macierz[i][j]=m.macierz[i][j]+macierz[i][j];
	return wynik;
}

//PLIK main.cpp

			Macierz macierz1(s,w);
			cin>>macierz1;
			
			Macierz macierz2(s,w);
			cin>>macierz2;

			Macierz wynik=macierz1+macierz2;
0

Oba macierze z pewnoscia nie maja takiej samej wysokosci i szerokosci, wiec pewnie odwolujesz sie do nieistniejacego obiektu.

0

W konstruktorach masz pomieszane rozmiary w pętlach m.szer z m.wys(szer i wys analogicznie) i to jest przyczyną błędu. Z tego co wywnioskowałem zewnętrzna pętla ma mieć w warunku m.szer a wewnętrzna m.wys.

0

Tak jak napisał @davemajster, oraz w destruktorze i operatorze + masz ten sam problem.
Nie powinno tu być konstruktora domyślnego
Oprócz tego brak operatora =
Oraz radzę załatwić to tabelą jednowymiarową:

class Macierz
  {
   private:
   double *M;
   unsigned Y,X; // no chyba że umiesz obsłużyć ujemne wysokości i szerokości.
   public:
   Macierz(unsigned Y,unsigned X):Y(Y),X(X),M(new double[Y*X]){}
   Macierz(Macierz &m);
   ~Macierz() { if(Y&&X) delete[] M; } 
   Macierz operator+(Macierz &m); 
   double *operator[](unsigned y) { return M+y*X; } // użycie Macierz m(4,4); m[3][3]=0; cout<<m[3][3];
   double &at(unsigned y,unsigned x) { return M[y*X+x]; } // użycie Macierz m(4,4); m.at(3,3)=0; cout<<m.at(3,3);
  };

Macierz::Macierz(Macierz &m):Y(m.Y),X(m.X),M(new double[Y*X]) { memcpy(M,m.M,Y*X*sizeof(double)); }
Macierz Macierz::operator+(Macierz &m) { Macierz r(m); for(unsigned i=0,e=Y*X;i<e;++i) r.M[i]+=M[i]; return r; }

Zauważ że to co podałem to wszystko co ty masz plus trochę więcej.

1 użytkowników online, w tym zalogowanych: 0, gości: 1