Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: milya777 en 22 Marzo 2011, 08:22 am



Título: Mi programa no libera memoria, estoy usando heapdestroy y heapcreate
Publicado por: milya777 en 22 Marzo 2011, 08:22 am
Hola como andan? cree un programa que atiende clientes con su main correspondiente y con _begintheadex para atender a cada uno, pero el problema es que cuando voy al administrador de tareas veo mi proceso con una cantidad de memoria como 700kb, luego cuando un cliente se conecta aumenta como es logico, pero cuando se termina de atender al mismo la memoria no es eliminada, uso heapdestroy porq creo un heap de memoria antes con heapcreate. Para aclarar más el tema quiero decir que estoy trabajando en c++ con codigo en c, o sea no uso objetos, y lo hago con el visual studios en windows.para alocar memoria uso new.Espero que me puedan ayudar porq no puedo dejar al servidor solo porq pincha(segmentation fault) al aumentar la memoria a valores muy altosbueno gracias¡¡


Título: Re: Mi programa no libera memoria, estoy usando heapdestroy y heapcreate
Publicado por: Akai en 22 Marzo 2011, 09:06 am
Si creas memoria con new, la borras con delete. Si lo haces con malloc, la liberas con free. NUNCA mezcles formas de llamar y liberar memoria, porque no sabes como están o no implementadas por debajo.


Título: Re: Mi programa no libera memoria, estoy usando heapdestroy y heapcreate
Publicado por: milya777 en 22 Marzo 2011, 23:15 pm
claro te entiendo el tema que saque los delete porq a veces cuando los uso pincha mi servidor, los uso bien pero no entiendo porq pincha , entonces lo que hice es sacarlos,

otra cosa sobre heapdestroy, debería eliminar ese espacio de memoria que uso, leí que no hace falta usar delete o heapfree porq ya con heapdestroy elimina todo, aunque como puse más arriba en el administrador de tarea, en mi proceso sigue estando la memoria usada en ese thread

gracias por tu respuesta


Título: Re: Mi programa no libera memoria, estoy usando heapdestroy y heapcreate
Publicado por: Akai en 22 Marzo 2011, 23:28 pm
Si "pincha" tu servidor, es que algo falla. Manejas mal la memoria.

Recurrir a otro método que no sea delete para memoria solicitada con new, como tu mismo has experimentado, da resultados imprevisibles. Como ya dije, no puedes saber si new usa malloc por debajo, y tanto delete como heap destroy hacen uso de free.

Regla de oro:
Free what you malloc, delete what you new.


Título: Re: Mi programa no libera memoria, estoy usando heapdestroy y heapcreate
Publicado por: milya777 en 22 Marzo 2011, 23:40 pm
ok voy a tener en cuenta esa regla, voy a seguir probando donde introducir los deletes que por ahora no uso, y voy a seguir buscando proq aumenta si ser eliminada el uso de la memoria del programa

gracias


Título: Re: Mi programa no libera memoria, estoy usando heapdestroy y heapcreate
Publicado por: Akai en 23 Marzo 2011, 09:05 am
En C o C++ no hay problemas de no se "libera" correctamente. Más bien, no la "liberas" correctamente. Fíjate que los destructores de tus clases llamen a destruir la memoria dinámica que generen etc etc etc.

También puedes probar a usar profilers como gprof, valgrind (su herramienta massif te da información de memoria, valgrind como tal de memory leaks) para er qué está pasando.

PD: no hace falta hacer doble post.


Título: Re: Mi programa no libera memoria, estoy usando heapdestroy y heapcreate
Publicado por: milya777 en 23 Marzo 2011, 16:45 pm
Me fije esos programas pero son para unix según lo que busque,  hay uno para windows ibm rational purify pero no lo consigo todavía si lo encuentro aviso, mira pongo el código para que veas como libero la memoria

//creo el heap de memoria
   HANDLE heapDevolverPedidos;
   heapDevolverPedidos = HeapCreate(0,0,0);  
    if (heapDevolverPedidos == NULL) {
        cout << "Error al crear un heap de memoria\n" << endl;
        grabarLog("ERROR","Error al crear un heap de memoria","webServer.cpp");
      closesocket(cliente);
      _endthreadex(0);
    }


// Para asignar memoria lo hago así

      char* buffer;
   if ((buffer = new char[BUFFER]) == NULL){
      grabarLog("ERROR","Error al asignar memoria","webServer.cpp");
      exit(1);
   }

// Para destruir la mem

delete [] buffer;

// para destruir el heap de memoria hago esto

   if (HeapDestroy(heapDevolverPedidos) == FALSE){
      printf("Error al destruir heap de memoria\n");
      grabarLog("ERROR","Error al destruir heap de memoria","webServer.cpp");
   }



gracias por contestar

EI: juntando mensajes.

Hola hago otra pregunta siempre sobre este problema que no puedo resolver, si asigno memoria a una variable en un hilo cuando cierro el mismo o lo mato la memoria en c no se elilmina? se que c no tiene garbage collector, pero cuando elimino un proceso no se elimina su espacio de memoria,

y en el caso de que tenga que hacerlo yo, que lo hago como lo puse arriba está bien echo?

necesito su ayuda, gracias


Título: Re: Mi programa no libera memoria, estoy usando heapdestroy y heapcreate
Publicado por: Eternal Idol en 29 Marzo 2011, 12:04 pm
Si usas new usa OTRO heap y no el que creaste, si usas esas funciones Heap* usalas completas, lee la MSDN y usa el sentido comun.

Memory management. (http://msdn.microsoft.com/en-us/library/aa366779(v=VS.85).aspx)