Ver Mensaje Individual
  #11 (permalink)  
Antiguo 22/03/2013, 13:03
vosk
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: [C++] Duda con new y delete o delete[]

"...Para el resto de los casos si habría que poner el NULL claro ;) ..."

Ok estamos de acuerdo: a esos me referia, una unica funcion de inicio que llama a un rack de funciones de carga, y una unica funcion de final que llama a un rack de funciones de descarga.

Ojo lo de las variables no inicializadas: asumí que tenias el 'n' como global o lo que sea, por eso en el ejemplo puse un define para las filas y columnas. Si no inicializas una variable el sistema le asigna un valor basura que no tendrá sentido en el ambito de tu aplicacion (lo mismo sucede con los punteros, por si solos no se inician a nulo).

Para las comprovaciones de error: si no vas a usar objetos puedes usar el malloc - free de C y comprovar directamente un retorno nulo; si vas a usar objetos necesariamente usaras el new - delete. El 'new' genera por defecto excepciones para los casos de error, la buena practica pasa por comprovar las excepciones (echa un vistazo a try - catch, es la forma de hacerlo). Aun hay otra opcion para el 'new', consiste en forzar que no genere excepciones y retorne nulo en caso de cualquier error (ojo, por defecto no retorna nulo sino que genera una excepcion, no es lo mismo). En cualquier caso cuando trabajes con memoria dinamica es muy aconsejable hacer todas las comprovaciones de error.

Una forma de hacerlo con nothrow:

Código:
int **crear_matriz(int filas, int columnas) {
	int **matriz = 0;
	
	if(!(matriz = new (nothrow) int *[filas])) {
		return 0;
	}
	
	for(int f = 0; f < filas; f++) {
		if(!(matriz[f] = new (nothrow) int[columnas])) {
			return 0;
		}
	}
	
	return matriz;
}

void llenar_matriz(int **matriz, int filas, int columnas) {
	int i = 0;
	
	for(int f = 0; f < filas; f++) {
		for(int c = 0; c < columnas; c++) {
			matriz[f][c] = i++;
		}
	}
}

void volcar_matriz(int **matriz, int filas, int columnas) {
	for(int f = 0; f < filas; f++) {
		for(int c = 0; c < columnas; c++) {
			printf("%d\t", matriz[f][c]);
		}
		printf("\n");
	}
}

void vaciar_matriz(int **matriz, int filas, int columnas) {
	if(matriz) {
		for(int f = 0; f < filas; f++) {
			if(matriz[f]) {
				delete [] matriz[f] ;
			}
		}
		delete [] matriz;
	}
}

int main() {
	int **matriz, filas, columnas;
	
	matriz = 0;//en este caso no seria necesario
	filas = 3;
	columnas = 5;
	
	if((matriz = crear_matriz(filas, columnas))) {
		llenar_matriz(matriz, filas, columnas);
		volcar_matriz(matriz, filas, columnas);
	}
	vaciar_matriz(matriz, filas, columnas);
	
	getchar();
	return 0;
}
Puedes ver que en las comprovaciones de error puedo validar contra nulo porque se que en caso de error el nothrow me retornó un nulo.

Saludos
vosk