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:
#include "tlistacom.h"
#include <iostream>
using namespace std;
int main() {
TComplejo numero(1.0, 2.0);
TListaCom lista;
bool errorMemoria;
do {
bien=lista.InsCabeza(numero);
} while (bien);
if (!bien)
cout << "NO HUBO MEMORIA Y SE PARO A TIEMPO" << endl;
else
cout << "NO SE PARA.. QUE RARO!!" << endl;
return 0;
}
TListaCom:
#include "tlistacom.h"
using namespace std;
using std::exception;
using std::bad_alloc;
// Muchisimas cosas por aqui en medio...
bool TListaCom::InsCabeza (const TComplejo& num) {
bool errorMemoria=false;
if (this->EsVacia()) { // Si esta vacia, inserto "A SACO" el primero
try {
primero=new TListaNodo(num);
}
catch (bad_alloc &error) {
errorMemoria=true;
cout << "ERROR " << error.what() << endl;
}
if (!errorMemoria)
ultimo=primero;
}
else {
TListaNodo *Prim=primero; // Obtengo el primero
primero=NULL; // Para crear el nodo
try {
primero=new TListaNodo(num);
}
catch (bad_alloc &error) {
errorMemoria=true;
cout << "ERROR " << error.what() << endl;
}
if (!errorMemoria) {
primero->anterior=NULL;
primero->siguiente=Prim;
(Prim->anterior)=primero;
}
}
return !errorMemoria;
}
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