Foros del Web » Programación para mayores de 30 ;) » C/C++ »

New y Delete con matrices

Estas en el tema de New y Delete con matrices en el foro de C/C++ en Foros del Web. Este programa me da un error en tiempo de ejecucion parece que hace llamado al destructor y libera memoria cuando ya se ha liberado pero ...
  #1 (permalink)  
Antiguo 13/12/2007, 16:56
 
Fecha de Ingreso: julio-2005
Mensajes: 4
Antigüedad: 19 años, 5 meses
Puntos: 0
New y Delete con matrices

Este programa me da un error en tiempo de ejecucion parece que hace llamado al destructor y libera memoria cuando ya se ha liberado pero no he podido encontrar la solucion? que estare haciendo mal:
Código:
//MATRICES DINAMICAS CON SOBRECARGA DE OPERADORES
//Powered by Gel.
# include <iostream.h>
# include <conio.h>
enum logico {FALSE,TRUE};
class matrix
{
	int f,c; //filas, columnas
	int **mat;
	public:
		matrix(int fil=0, int col=0); //prototipo constructor
		int filas(){return f;}
		int columnas(){return c;}
		matrix operator + (matrix &b);
		matrix operator * (matrix &b);
		logico operator == (matrix &b);
		logico igualdimencion(matrix &b);
		logico puedemultiplicarcon(matrix &b);
		friend ostream& operator<<(ostream& , matrix &); //salida
		friend istream& operator>>(istream& , matrix &); //entrada
		~matrix();  //Prototipo Destructor
};

matrix::matrix(int fil,int col)  //constructor
{
  f=fil;
  c=col;
  //asignación de memoria dinámica a la matriz
  if (f!=0)
  {
	 mat = new int * [f];  //para las fila
	 for (int i=0;i<f;i++)
			mat[i] = new int [c]; //para las columnas
	 //inicialización de valores de la matriz
	 for (i=0;i<f;i++)
		for (int j=0;j<c;j++)
		  mat[i][j]=0; //todos los elementos a cero
  }
  cout<<"\n\t Constructor matriz";
}
matrix::~matrix() //Destructor
{
	int i;
	for(i=0;i<f;i++)
	{
		if (mat!=0)
			 delete [] mat[i]; //libera las filas de la matriz
	}
	if (mat!=0)
		delete [] mat; // libera el puntero mat
	cout<<"\n\t Destructor matriz";
}
ostream& operator<<(ostream &os, matrix &a) //operador de salida standard
{
  for (int i=0;i<a.f;i++) //for 1
  {
	 for (int j=0;j<a.c;j++)
		 os<<a.mat[i][j]<<"  ";
	 os<<"\n"; //una linea por cada fila impresa
  } //for 1
	return os;
}
istream& operator>>(istream &is, matrix &a) //operador de entrada standard
{
  int i,j;
  for (i=0;i<a.f;i++) //for 1
	 for (j=0;j<a.c;j++) //for 2
	 {
		 cout<<"Elemento ["<<i<<"]["<<j<<"]: ";
		 is>>a.mat[i][j];
	 }
  return is;
}
matrix matrix::operator + (matrix &b) //operador + sobrecargado
{
	matrix res(f,c);
	int i,j;
	for (i=0;i<b.f;i++) //for 1
	  for (j=0;j<b.c;j++) //for 2
		 res.mat[i][j] = mat[i][j] + b.mat[i][j]; //suma de matrices
	return res;
}
matrix matrix::operator*(matrix &b) //operador multiplicacion sobrecargado
{
	matrix res(b); //constructor por copia
	for (int i=0;i<b.f;i++) //for 1
		for (int j=0;j<b.c;j++) //for 2
		{
			res.mat[i][j]=0;
			for (int k=0;k<b.f;k++)
				res.mat[i][j] = res.mat[i][j] + mat[i][k]* mat[k][j];
		}
	return res;
}
logico matrix::operator == (matrix &b) //operador de igualdad sobrecargado
{
	int i,j;
	logico identica;
	identica = TRUE;
	if ((f!=b.f)||(c!=b.c))
		identica=FALSE;
	else
	  for (i=0;i<b.f;i++) //for 1
		  for (j=0;j<b.c;j++)
			  if (mat[i][j]!=b.mat[i][j])
				  identica=FALSE;

	return identica;
}
logico matrix::igualdimencion(matrix &b)
{
	 if ((f==b.f) && (c==b.c))
		 return TRUE;
	 else
		 return FALSE;
}
logico matrix::puedemultiplicarcon(matrix &b)
{
	 if (c==b.f)
		return TRUE;
	 else
		return FALSE;
}

//Inicio programa principal
void main()
{
 //	int filas,columnas;
	matrix a(2,2),b(2,2);//,c(2,2);
	int op;

	do{
		//clrscr();
		cout<<"\n\t **** MENU DE OPCIONES **** ";
		cout<<"\n\t 1. Suma de matrices";
		cout<<"\n\t 2. Multiplicación de matrices";
		cout<<"\n\t 3. Salir del programa";
		cout<<"\n\t ¿Qué opción desea? -> ";cin>>op;

		if ((op>=1)&&(op<=2))
		{
			 cout<<"\n\t Ingresar matriz A \n";
			 //cout<<"\n\t Filas: ";cin>>filas;
			 //cout<<"\n\t Columnas: ";cin>>columnas;
			 //matrix a(filas,columnas); //construir la matriz a
			 cin>>a;
			 cout<<"\n\t Ingresar matriz B \n";
			 //cout<<"\n\t Filas: ";cin>>filas;
			 //cout<<"\n\t Columnas: ";cin>>columnas;
			 //matrix b(filas,columnas); //construir la matriz b
			 cin>>b;
		}
		switch(op)
		{
			case 1:
				cout<<"\n\t SUMA DE MATRICES: ";
				cout<<"\n Matriz A: \n"<<a;
				cout<<"\n Matriz B: \n"<<b;
				//c=(a+b);
				cout<<"\n Matriz resultado: \n"<<(a+b);
				break;
		  case 2:
				cout<<"\n\t MULTIPLICACION DE MATRICES: ";
				cout<<"\n Matriz A: \n"<<a;
				cout<<"\n Matriz B: \n"<<b;
				cout<<"\n Matriz resultado: \n"<<(a*b);
				break;
		  case 3:
				cout<<"\n\t Fin del programa...";
				break;
		  default:
				cout<<"\n\t Opción incorrecta [1..3]!";
				break;
	  }//switch
	  getch();
	}while (op!=3); //do while
} //main
Si alguien ha hecho alguno de matrices dinámicas utilizando clases que me pueda hechar una mano
  #2 (permalink)  
Antiguo 20/12/2007, 17:19
Avatar de TolaWare
Colaborador
 
Fecha de Ingreso: julio-2005
Mensajes: 4.352
Antigüedad: 19 años, 5 meses
Puntos: 24
Re: New y Delete con matrices

El manejo de la destrucción está bien hecho, el único detalle que le encuentro es en un el if del destructor:

matrix::~matrix() //Destructor
{
int i;
for(i=0;i<f;i++)
{
if (mat[i]!=0)
delete [] mat[i]; //libera las filas de la matriz
}
if (mat!=0)
delete [] mat; // libera el puntero mat
cout<<"\n\t Destructor matriz";
}

Está en rojo que lo agregué.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:15.