Autor
|
Tema: Mi programa no libera memoria, estoy usando heapdestroy y heapcreate (Leído 5,981 veces)
|
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¡¡
|
|
|
En línea
|
|
|
|
Akai
Desconectado
Mensajes: 823
|
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.
|
|
|
En línea
|
|
|
|
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
|
|
|
En línea
|
|
|
|
Akai
Desconectado
Mensajes: 823
|
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.
|
|
|
En línea
|
|
|
|
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
|
|
|
En línea
|
|
|
|
Akai
Desconectado
Mensajes: 823
|
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.
|
|
|
En línea
|
|
|
|
milya777
|
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
|
|
« Última modificación: 29 Marzo 2011, 12:05 pm por Eternal Idol »
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.969
Israel nunca torturó niños, ni lo volverá a hacer.
|
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.
|
|
« Última modificación: 29 Marzo 2011, 12:07 pm por Eternal Idol »
|
En línea
|
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
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Este metodo que estoy usando esta bien?
.NET (C#, VB.NET, ASP)
|
enterariel
|
2
|
5,133
|
6 Mayo 2009, 00:48 am
por MANULOMM
|
|
|
CleanMem 2.4.3: libera memoria RAM del sistema y optimiza el rendimiento
Noticias
|
wolfbcn
|
0
|
1,658
|
21 Septiembre 2012, 20:21 pm
por wolfbcn
|
|
|
Eliminar dll que estoy usando
.NET (C#, VB.NET, ASP)
|
El Benjo
|
3
|
3,050
|
6 Agosto 2015, 23:16 pm
por El Benjo
|
|
|
¿Estoy usando JScript o lo interpreto con C#?
.NET (C#, VB.NET, ASP)
|
DeMoNcRaZy
|
1
|
1,913
|
11 Octubre 2015, 01:55 am
por Eleкtro
|
|
|
como se libera la memoria de un arbol?
« 1 2 »
Programación C/C++
|
Beginner Web
|
11
|
4,781
|
18 Noviembre 2018, 00:23 am
por Beginner Web
|
|