• Lunes 29 de Abril de 2024, 10:30

Autor Tema:  Problema Con Try Catch  (Leído 1013 veces)

Ginta

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Problema Con Try Catch
« en: Viernes 23 de Diciembre de 2005, 02:23 »
0
En primer lugar, decir que no soy un experto de C++ ni mucho menos pero tengo una pregunta interesante relacionada con la memoria dinamica y tal, tengo la clase tlistacom que es una lista doblemente enlazada de numeros complejos (que la clase numeros complejos la hice tambien).. el caso es que cada nodo lleva un puntero a anterior, uno a siguiente y un complejo en si)..

La historia es un poco extraña.. para probar las excepciones que lanza el new (bad_alloc) en concreto, simplemente hice un bucle que va reservando ints a un puntero y cuando no queda memoria atrapa bien esta excepcion.

Sin embargo, cuando lo implemento con la clase TListaCom, bajo Windows si me coge el bad_alloc y no hay ningun problema, pero bajo linux, recibo una señal kill (con suerte solo a mi programa y no al resto del sistema...) porque no hay mas memoria en vez de coger la excepcion. Aqui os pongo el codigo de la funcion miembro que utilizo (InsCabeza) para meter un numero complejo a la cabeza de la Lista, porque ya no se si utilizo mas los try catch o que pasa :(

Muchas gracias por la ayuda por adelantado ^^

main:
Código: Text
  1.  
  2. #include "tlistacom.h"
  3. #include <iostream>
  4.  
  5. using namespace std;
  6.  
  7. int main() {
  8.   TComplejo numero(1.0, 2.0);
  9.   TListaCom lista;
  10.   bool errorMemoria;
  11.   do {
  12.     bien=lista.InsCabeza(numero);
  13.   } while (bien);
  14.   if (!bien)
  15.     cout << "NO HUBO MEMORIA Y SE PARO A TIEMPO" << endl;
  16.   else
  17.     cout << "NO SE PARA.. QUE RARO!!" << endl;
  18.  
  19.   return 0;
  20. }
  21.  
  22.  

TListaCom:
Código: Text
  1.  
  2. #include "tlistacom.h"
  3.  
  4.  
  5. using namespace std;
  6. using std::exception;
  7. using std::bad_alloc;
  8.  
  9. // Muchisimas cosas por aqui en medio...
  10.  
  11. bool TListaCom::InsCabeza (const TComplejo& num) {
  12.   bool errorMemoria=false;
  13.   if (this->EsVacia()) { // Si esta vacia, inserto "A SACO" el primero
  14.     try {
  15.       primero=new TListaNodo(num);
  16.     }
  17.     catch (bad_alloc &error) {
  18.       errorMemoria=true;
  19.       cout << "ERROR " << error.what() << endl;
  20.     }
  21.     if (!errorMemoria)
  22.       ultimo=primero;
  23.   }
  24.   else {
  25.     TListaNodo *Prim=primero; // Obtengo el primero
  26.  
  27.     primero=NULL; // Para crear el nodo
  28.     try {
  29.       primero=new TListaNodo(num);
  30.     }
  31.     catch (bad_alloc &error) {
  32.       errorMemoria=true;
  33.       cout << "ERROR " << error.what() << endl;
  34.     }
  35.     if (!errorMemoria) {
  36.       primero->anterior=NULL;
  37.       primero->siguiente=Prim;
  38.       (Prim->anterior)=primero;
  39.     }
  40.   }
  41.   return !errorMemoria;
  42. }
  43.  
  44.  

He probado muchas cosas, pero ya no se que puede pasar, y porqué bajo windows InsCabeza SI devuelve false cuando no hay más memoria y bajo linux no.. Gracias de nuevo..

P.D. Como nota he de decir que nunca he usado el manejo de excepciones y que lo que he intentado viene de rebuscar en el google o en las transparencias del tema de programacion, pero, como digo, ahora estoy completamente perdido de que funcione en un sistema y en otro no...

P.D.2 No quería tampoco poner todo el código porque ésto sería ilegible, si hace falta meto más cosas :)