elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Ingresar Registrarse
12 Octubre 2008, 22:55  



+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++
| | |-+  Recolector de basura (GARBAGE COLLECTOR)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Imprimir
Autor Tema: Recolector de basura (GARBAGE COLLECTOR)  (Leído 856 veces)
Ragnarok
Moderador Global
*****
Desconectado Desconectado

Mensajes: 4.227


Ver Perfil
Re: Recolector de basura (GARBAGE COLLECTOR)
« Respuesta #15 en: 06 Junio 2008, 00:14 »

Vale, haz otras ruedas que seguramente sean peores que las que ya hay, yo voy a usar las que están ahí y son gratis para hacer otras cosas de las que no hay.

de todas formas a todos aquellos que quieran "aprender" en vez de usar los códigos de otros... así quedó:

Te das cuenta de que tu código para otra persona es el código de "otro", ¿no?
En línea

No olvidéis leer las normas generales, además de las específicas de cada tablón.sgae, ladrones
Karman

Desconectado Desconectado

Mensajes: 237



Ver Perfil WWW
Re: Recolector de basura (GARBAGE COLLECTOR)
« Respuesta #16 en: 06 Junio 2008, 00:57 »

no es lo mismo... en mi código se explica el funcionamiento... es más un código didáctico que una librería... pero sos de las personas que nunca quieren perder...  :P

S2
En línea

Ragnarok
Moderador Global
*****
Desconectado Desconectado

Mensajes: 4.227


Ver Perfil
Re: Recolector de basura (GARBAGE COLLECTOR)
« Respuesta #17 en: 06 Junio 2008, 03:56 »

Es por pasar el rato, me alegro de ver que te lo tomas con humor ;)
En línea

No olvidéis leer las normas generales, además de las específicas de cada tablón.sgae, ladrones
Karman

Desconectado Desconectado

Mensajes: 237



Ver Perfil WWW
Re: Recolector de basura (GARBAGE COLLECTOR)
« Respuesta #18 en: 07 Junio 2008, 04:49 »

revisión Nº 14 del código (espero sea la final, por lo menos dejó de tirar excepciones.. xD) junto con explicación ... a alguien le puede servir algún día... (a mi me habría servido...)

Código
#include <windows.h>
 
using namespace std;
 
#include <new>
#include <memory>
 
#ifndef xgCOLLECTTIME
#define xgCOLLECTTIME 30000
#endif
 
class xgGCNodo{
 friend class xgGC;
 private:
   xgGCNodo(void *value){
     val = value;
     next = NULL;
     bDel = false;
   }
   xgGCNodo * next;
   bool bDel;
   void * val;
};
 
/*******************************************************************/
//
/*******************************************************************/
 
class xgObject{
 protected:
 xgObject(){};
 public:
   virtual ~xgObject(){}
   /* static */ void* operator new(size_t sz)throw (bad_alloc);//always is static...
   /* static */ void  operator delete(void* m)throw();//always is static...
   /* static */ void* operator new[](size_t sz)throw (bad_alloc);//always is static...
   /* static */ void  operator delete[](void* m)throw();//always is static...
};
 
/*******************************************************************/
//
/*******************************************************************/
 
class xgGC{
 private:
   xgGC();
   ~xgGC();
   //Pure Memory and List operations...
   void *Append(size_t sz)throw (bad_alloc);
   void Remove(void *val)throw();
 
 public:
 
   //Memory operations...
   static xgGC   *StartCollect()throw();
   static void *Alloc(size_t sz)throw (bad_alloc);
   static void Free(void *val)throw();
   static int  ForceCollect()throw();
   static void FreeCollect()throw();
 
   HANDLE xgGetExitEvent(){return hExitEvent;}
 
 private:
   //Collect timing Thread
   static DWORD WINAPI xgCollectThread(LPVOID params);
 
   //Extern operations
   static xgGC *GetpGC();
   int  Collect()throw();
   void FreeObjects()throw();
 
   xgGCNodo *first,*last;
   unsigned int nelem;
   DWORD cThid;HANDLE hExitEvent;
   static class xgGC* pgc;
};
 
/*******************************************************************/
//
/*******************************************************************/
 
class xgGC* xgGC::pgc=NULL;
 
xgGC::xgGC(){
pgc=NULL;nelem=0;
first=last=NULL;
//Creamos Evento...
hExitEvent=CreateEvent(NULL,FALSE,FALSE,"#XGGC#EXITEVENT#XGGC#");
if(hExitEvent)
  CreateThread(NULL,0,xgCollectThread,(void *)this, 0, &cThid);
}
 
xgGC::~xgGC(){
 if(hExitEvent){
   SetEvent(hExitEvent);
   CloseHandle(hExitEvent);
   hExitEvent=NULL;
 }
 FreeObjects();
}
 
xgGC* xgGC::GetpGC(){
 return pgc;
}
 
xgGC *xgGC::StartCollect()throw(){
 if(!pgc)pgc=new xgGC;
 return pgc;
}
 
void* xgGC::Alloc(size_t sz)throw (bad_alloc){
 if(pgc)return pgc->Append(sz);
 else return operator new(sz);
}
 
void xgGC::Free(void *val)throw(){
 if(pgc)pgc->Remove(val);
 else operator delete(val);
}
 
int  xgGC::ForceCollect()throw(){
 if(pgc)pgc->Collect();
}
 
void xgGC::FreeCollect()throw(){
 if(pgc)delete pgc;
}
 
//Append new item...
void *xgGC::Append(size_t sz)throw (bad_alloc){
 void *m=operator new(sz);
 if(m){
   xgGCNodo *pt=new xgGCNodo(m);
   if(first==NULL)first = pt;
   else last->next = pt;
   last=pt;++nelem;
 }
 return m;
}
 
//Mark for delete...
void xgGC::Remove(void *val)throw(){
 for(xgGCNodo *pt=first;pt&&val;pt=pt->next)
   if(pt&&pt->val==val){
     pt->bDel=true;
     break;
   }
}
 
//Free marked memory...
int xgGC::Collect()throw(){
 xgGCNodo *pt=first;
 xgGCNodo *nxt,*prv= NULL;
 while(pt){
   nxt = pt->next;
   if(pt->bDel==true){
     //Reorganice list..
     if(first==pt)first=nxt;
     else prv->next=nxt;
     //Free memory...
     operator delete(pt->val);
     delete pt;--nelem;
   }else
     prv = pt;
   pt = nxt;
 }
 return nelem;
}
 
/*******************************************************************/
//
/*******************************************************************/
 
void* xgObject::operator new(size_t sz)throw (bad_alloc){
 return xgGC::Alloc(sz);
}
 
void xgObject::operator delete(void* m)throw(){
 xgGC::Free(m);
}
 
void* xgObject::operator new[](size_t sz)throw (bad_alloc){
 return operator new(sz);
}
 
void xgObject::operator delete[](void* m)throw(){
 operator delete(m);
}
 
/*******************************************************************/
//
/*******************************************************************/
 
void xgGC::FreeObjects()throw(){
 xgGCNodo *nxt=NULL,*pt=first;
 while(pt){
   nxt=pt->next;
   if(pt->val){
     if(!pt->bDel)//Call destructor...
       delete (xgObject *)pt->val;
     //Free memory...
     operator delete(pt->val);
   }
   delete pt;pt=nxt;
 }
 first=NULL;
 pgc=NULL;
 
}
 
/*******************************************************************/
//
/*******************************************************************/
 
DWORD WINAPI xgGC::xgCollectThread(LPVOID params){
 xgGC *pGC=(xgGC*)params;
 if(pGC){
   HANDLE hExitEvent=pGC->xgGetExitEvent();
   for(;;){
     DWORD dwRes=WaitForSingleObject(hExitEvent,xgCOLLECTTIME);
     switch(dwRes){
       case WAIT_TIMEOUT:
         pGC->Collect();
       break;
       case WAIT_ABANDONED_0:case WAIT_OBJECT_0:
         ExitThread(0);
       break;
     }
   }
 }
 //Finalizamos thread...
 ExitThread(0);
}
 
/*******************************************************************/
//
/*******************************************************************/
 
class foo:public xgObject{
 public:
   foo(){n=100;printf("foo created\n",n);}
   ~foo(){printf("foo deleted\n",n);}
   void asdf(){printf("%d\n",n);}
 private:
   int n;
};
 
int main(void){
 xgGC::StartCollect();
 int av,*p;
 printf("\n\n");
 foo *b=new foo;
 b->asdf();
 //delete b;
 xgGC::FreeCollect();
 system("pause");
 return 0;
}
 

definición: http://es.wikipedia.org/wiki/Recolecci%C3%B3n_de_basura

conceptos generales:  un recolector de basura se basa en la sobrecarga de los operadores new y delete (o definiendo funciones Xmalloc Xfree en C), existen de dos tipos, los que administran la memoria directamente (como un único bloque) se encargan de ir redimencionando dicho bloque para poder responder a las solicitudes de memoria, o (como yo lo implementé) mediante listas que no exige el uso de templates (los espacios de memoria se reservan directamente, pero no se utilizan directamente), utilicé este método porque... cuanto más controles se le pone al uso de los punteros... más recursos se utilizan... (y no quiero un visual basic)... :P

sobre la sobre carga de new y delete... hay poca información... (sobre todo en español) o está incompleta... pero... básicamente hay dos formas de sobreescribir new y delete, una global y la otra por clase:

redefinición global:
Código
operator new(size_t sz)throw (bad_alloc){
}
operator delete(void* m)throw(){
}
 

el problema de la redefinición global es que no nos permite personalizar demasiado el comportamiento (como es global reemplaza las standares de C++) y nos deja a la merced de muchos errores en tiempo de ejecución (los standares ya previeron la mayoría de ellos)... por lo tanto lo mejor es la redefinición local (en clases).

Código
class xgObject{
 protected:
 xgObject(){};
 public:
   virtual ~xgObject(){}
   /* static */ void* operator new(size_t sz)throw (bad_alloc);//always is static...
   /* static */ void  operator delete(void* m)throw();//always is static...
   /* static */ void* operator new[](size_t sz)throw (bad_alloc);//always is static...
   /* static */ void  operator delete[](void* m)throw();//always is static...
};

este tipo de clases están definidas en todos los frameworks y/o lenguajes (smalltalk, java, mfc, xgWidgets, y muchos otros), lo que hace es definir una clase "general" que permite definir un nuevo comportamiento de los operadores new y delete (entre otras cosas) de todas las clases que la hereden (no de tipos puros)... (un detalle poco documentado de C++ es que la sobrecarga de los operadores (new y delete) siempre serán estáticos... por más que no se lo defina).

la clase xgGC() es una clase especial, está definida para que no pueda ser creada más de una vez... (de todas formas se la puede corromper intencionalmente)... esta clase lo único que hace es ir almacenando una referencia (puntero) a cada espacio de memoria reservado, y al eliminarlo marcarlo (no lo elimina directamente) para ser eliminado, esta clase a su vez, crea un thread (hilo de ejecución) encargado de ir eliminado los espacios de memoria marcados para eliminar, (con este detalle se corrigen un par de errores complicados de corregir en proyectos grandes, por eso la cree), además de eso, (en su destructor) incluye una rutina que liberará los espacios de memoria reservados no liberados con lo cual eliminará los "memory leaks"... esperando que alguien le sirva lo explicado... me despido...  :P

S2
« Última modificación: 07 Junio 2008, 04:51 por Karman » En línea

Ragnarok
Moderador Global
*****
Desconectado Desconectado

Mensajes: 4.227


Ver Perfil
Re: Recolector de basura (GARBAGE COLLECTOR)
« Respuesta #19 en: 07 Junio 2008, 19:27 »

¿Has pensado en usar sourceforge o google code? Te dan un servidor con subversion en el que alojar tus proyectos, así sólo tienes que poner el enlace al sitio que sea y allí tienes el código actualizado y la documentación.

Lo digo porque aunque esperas que sea la última versión rara vez algo es perfecto y se llega a esta "última versión", de esta forma puedes trabajar de forma más cómoda y no tienes que actualizar lo que hay en el foro cada vez.

http://code.google.com/hosting/
http://sourceforge.net/
En línea

No olvidéis leer las normas generales, además de las específicas de cada tablón.sgae, ladrones
Karman

Desconectado Desconectado

Mensajes: 237



Ver Perfil WWW
Re: Recolector de basura (GARBAGE COLLECTOR)
« Respuesta #20 en: 21 Junio 2008, 02:41 »

na... no es necesario... es la final... además tendría que armar un sitio o indagar como funcionan esos webs...  :P

S2
En línea

Páginas: 1 [2] Ir Arriba Imprimir 
Ir a:  







Consolas     La Web de Goku     MilW0rm     MundoDivx

Hispabyte     Truzone     TodoReviews     ZonaPhotoshop

hard-h2o modding    Foros de ayuda    Yashira.org    Videojuegos    indetectables.net   

Noticias Informatica    Seguridad Informática    ADSL    Foros en español    eNYe Sec

Todas las webs afiliadas están libres de publicidad engañosa.

Powered by SMF 1.1.6 | SMF © 2006-2008, Simple Machines LLC