Autor |
Mensaje |
tercoIDE
Analista Programador
Registrado: Noviembre 2013
Mensajes: 713
Edad: 54
|
Re: Puede Una Instancia De Una Clase Suicidarse?
Claro, es cierto.
Pero estoy seguro que hay una funcion oculta que libera un objeto y puede llamarse desde si mismo.
La secuencia de trabajo completa es la siguente:
' en alguna parte
Public perros as New Object[]
Public Sub Main()
Dim NewDog as clsPerro
Dim batuque as New clsPerro("La vida es muy complicada")
perros.Add(batuque)
NewDog = perros.Last ' esto es una referencia al objeto real
NewDog.Pensar()
If NewDog Then Message("Pero todavia estoy vivo")
NewDog.Freud = "Las perras me ignoran"
' quiero que NewDog = Null aqui , y que ademas el objeto este liberado de la memoria
la clase clsPerro es
=================== "Los IF son mas rápidos" - autor anónimo
|
#11 Miercoles, 22 Abril 2020, 13:38 |
|
|
vuott
Analista Programador
Registrado: Agosto 2013
Mensajes: 2086
Edad: 60 Ubicación:
|
Re: Puede Una Instancia De Una Clase Suicidarse?
tercoIDE escribió: Pero estoy seguro que hay una funcion oculta que libera un objeto y puede llamarse desde si mismo.
Muy probable.
Habría que estudiar detenidamente las fuentes de bajo nivel de este tema.
|
#12 Miercoles, 22 Abril 2020, 15:07 |
|
|
tercoIDE
Analista Programador
Registrado: Noviembre 2013
Mensajes: 713
Edad: 54
|
Re: Puede Una Instancia De Una Clase Suicidarse?
=================== "Los IF son mas rápidos" - autor anónimo
|
#13 Miercoles, 22 Abril 2020, 15:24 |
|
|
vuott
Analista Programador
Registrado: Agosto 2013
Mensajes: 2086
Edad: 60 Ubicación:
|
Re: Puede Una Instancia De Una Clase Suicidarse?
|
#14 Miercoles, 22 Abril 2020, 15:44 |
|
|
vuott
Analista Programador
Registrado: Agosto 2013
Mensajes: 2086
Edad: 60 Ubicación:
|
Re: Puede Una Instancia De Una Clase Suicidarse?
vuott escribió: De bajo nivel nosotros podemos alterar fácilmente la estructura interna principal de la Clase , pero causaríamos el crash del programa... es como decir: " Muera Sansón con los Filisteos !".
En general un Objeto está formado por una Estructura principal, llamada " GB_BASE" que puedes ver en el archivo fuente .../main/share/gambas.h.
(Mira tambien la Estructura " Struct OBJECT" en el archivo: .../main/gbx/gbx_object.h)
Bueno, esta Estructura en sus primeros 8 byte tiene la dirección de memoria de otra Estructura, llamada " _CLASS" que puedes ver en el archivo fuente .../main/gbx/gbx_class.h.
Basta con borrar la dirección de memoria de la Estructura Struct _Class, poniendo a cero aquellos primeros 8 bytes de la estructura principal GB_BASE) para hacer inservible estas Estructuras mismas.
Exemplum maximum.
Pongamos un Botón en un Formulario y este codigo:
Public Sub Form_Open()
Dim p1 As Pointer
Dim st As Stream
p1 = Object.Address(Button1) ' Aquí hemos penetrado en la Estructura principal "Struct GB_BASE"
' Vamos a leer el nombre del Objeto "Button1":
Print Button1.Name
' Ponemos a CERO los primeros ocho bytes de la Estructura principal "Struct GB_BASE"
st = Memory p1 For Write
Write #st, &00 As Pointer
st.Close
' Ahora intentemos de nuevo leer el nombre del Objeto "Button1":
Print Button1.Name
End
... Requiem aeternam dona eis......
última edición por vuott el Jueves, 23 Abril 2020, 00:10; editado 4 veces
|
#15 Miercoles, 22 Abril 2020, 23:56 |
|
|
tercoIDE
Analista Programador
Registrado: Noviembre 2013
Mensajes: 713
Edad: 54
|
Re: Puede Una Instancia De Una Clase Suicidarse?
has ido a las entrañas de la tierra
=================== "Los IF son mas rápidos" - autor anónimo
|
#16 Jueves, 23 Abril 2020, 00:30 |
|
|
vuott
Analista Programador
Registrado: Agosto 2013
Mensajes: 2086
Edad: 60 Ubicación:
|
Re: Puede Una Instancia De Una Clase Suicidarse?
tercoIDE escribió: has ido a las entrañas de la tierra
...quieres conocer el nombre de la "Clase", a la que pertenece el Objeto "Button1" ?
Este nombre està escrito en el 5° miembro de la Estructura " _CLASS", que puedes ver en el archivo fuente .../main/gbx/gbx_class.h .
Prueba este codigo:
Public Sub Form_Open()
Dim p1, p2, p3 As Pointer
p1 = Object.Address(Button1) ' Ahora estamos en "Struct GB_BASE"
p2 = Pointer@(p1) ' Ahora estamos en "Struct _CLASS"
' Con la aritmética de los Punteros avanzamos 24 bytes a lo largo del área de memoria de la estructura "Struct _CLASS" y
' penetramos en el miembro llamado "name" de "Struct _CLASS", es decir el 5° miembro de esta Estructura.
p3 = Pointer@(p2 + 24)
' Vamos a leer el nombre la "Clase", a la que pertenece el Objeto "Button1":
Print String@(p3)
End
...y otras cosas así.
última edición por vuott el Jueves, 23 Abril 2020, 01:19; editado 4 veces
|
#17 Jueves, 23 Abril 2020, 01:06 |
|
|
tercoIDE
Analista Programador
Registrado: Noviembre 2013
Mensajes: 713
Edad: 54
|
Re: Puede Una Instancia De Una Clase Suicidarse?
vuott escribió: tercoIDE escribió: has ido a las entrañas de la tierra
...quieres conocer el nombre de la "Clase", a la que pertenece el Objeto "Button1" ?
Este nombre està escrito en el 5° miembro de la Estructura " _CLASS", que puedes ver en el archivo fuente .../main/gbx/gbx_class.h .
Prueba este codigo:
Public Sub Form_Open()
Dim p1, p2, p3 As Pointer
p1 = Object.Address(Button1) ' Ahora estamos en "Struct GB_BASE"
p2 = Pointer@(p1) ' Ahora estamos en "Struct _CLASS"
' Con la aritmética de los Punteros avanzamos 24 bytes a lo largo del área de memoria de la estructura "Struct _CLASS" y
' penetramos en el miembro llamado "name" de "Struct _CLASS", es decir el 5° miembro de esta Estructura.
p3 = Pointer@(p2 + 24)
' Vamos a leer el nombre la "Clase", a la que pertenece el Objeto "Button1":
Print String@(p3)
End
...y otras cosas así.
Esto es el centro mismo de la tierra
El problema que yo veo usando ese bajo nivel es que si en alguna futura version de Gambas4 cambia GB_Class.h , nuestro programa dejara de funcionar.
=================== "Los IF son mas rápidos" - autor anónimo
|
#18 Jueves, 23 Abril 2020, 11:25 |
|
|
vuott
Analista Programador
Registrado: Agosto 2013
Mensajes: 2086
Edad: 60 Ubicación:
|
Re: Puede Una Instancia De Una Clase Suicidarse?
tercoIDE escribió: El problema que yo veo usando ese bajo nivel es que si en alguna futura version de Gambas4 cambia GB_Class.h , nuestro programa dejara de funcionar.
Por supuesto.
Todo lo que hice fue mostrar una curiosidad.
|
#19 Jueves, 23 Abril 2020, 15:14 |
|
|
|