Mi programa no libera memoria, estoy usando heapdestroy y heapcreate

Iniciado por milya777, 22 Marzo 2011, 08:22 AM

0 Miembros y 3 Visitantes están viendo este tema.

milya777

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¡¡

Akai

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.

milya777

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

Akai

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.

milya777

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

Akai

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.

milya777

#6
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

Eternal Idol

#7
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.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón