[C con Clase] Problema al terminar de ejecutar

Davidson, Steven srd4121 en njit.edu
Vie Jun 21 06:54:31 CEST 2013


Hola César,

On Fri, Jun 21, 2013 at 12:12 AM, César Arias <sinatra435 en hotmail.com>wrote:

>  Hola, hola, tengo un pequeño problema con este programa:
>
>
[CORTE]

Como se darán cuenta al ejecutarlo el programa llega hasta el final, pero
> al terminar salen un mensaje de diciendo que el programa dejo de funciona.
>
> Gracias por sus respuestas de antemano.
>
>
>
El problema está en la instanciación de 'men'. Escribes:

MAT mat(3), men(3-2);

Esto implica que creas una matriz de 1x1 para 'men'. Luego usas tal matriz
aquí:

mat.menor( men, 0, 0 );

que funciona en base a la matriz 3x3 de 'mat' para crear una submatriz de
2x2. Sin embargo, 'men' es una matriz de 1x1. Estás accediendo a memoria
que no pertenece a 'men.m' e intentas guardar enteros más allá de los
límites del array dinámico que creas para 'men'.

La solución es crear una matriz cuadrada de tamaño correcto; esto es,

MAT men(2);


Además, por alguna razón usas 'malloc()' y 'free()' cuando es muchísimo más
sencillo y seguro usar los operadores 'new[]' y 'delete[]' que pertenecen
al lenguaje de C++. De hecho, provocas un error con el uso de 'malloc()' en
el constructor. Escribes:

m=(int **)malloc(sizeof(unsigned)*ord);

Usas 'unsigned' cuando deberías calcular el tamaño de un puntero; esto es,

m = (int **) malloc( sizeof(int *) * ord );

Por esto mismo aconsejo usar 'new[]', ya que toma en cuenta el tamaño
correcto del tipo de dato. Simplemente escribe:

m = new int*[ord];


Debes implementar un destructor, especialmente para el diseño de 'MAT', ya
que adjudicas memoria dinámicamente; y por tanto, debes desadjudicarla, a
más tardar en su destructor. Veo que has intentando hacer esto, pero el
problema es que intentas liberar la memoria de 'ord'. Esto es un error,
porque no tienes control sobre su gestión de memoria; su liberación de
memoria se hace automáticamente.


Por último, no aconsejo acostumbrarse a usar 'continue'. Entiendo que en
este caso, viene como anillo al dedo, pero en general uno debería diseñar
sin pensar en 'continue', 'break', ni por supuesto 'goto'.


Espero que todo esto aclare las dudas.

Steven
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130621/5fff61f1/attachment-0001.html>


Más información sobre la lista de distribución Cconclase