![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
||||
|
||||
No, no. Si no quieres ver "Invalid pointer operation" y similares, nunca liberes un objeto referenciado por una interfaz que descienda de TInterfacedObject.
Vamos a ver: no es que Delphi maneje automáticamente la memoria de las interfaces. Lo que sucede es que cada vez que se hace referencia a una interfaz, el compilador añade una llamada a _AddRef, y cada vez que una referencia sale de alcance (por ejemplo, si se tiene una variable interfaz en un procedimiento y se sale de éste), el compilador añade una llamada a _Release. Pero lo que hagan _AddRef y _Release depende de la clase que haya implementado la interfaz. TInterfacedObject es quien implementa la recolección automática al mantener un conteo de cuántas referencias hay. Cuando _Release ve que la cuenta llega a cero, automáticamente llama al destructor del objeto. Por ello, si hacemos nosotros mismos el Free, _Release marcará el "Invalid Pointer Operation", pues intentará hacer un Free de un objeto que ya no existe. Si implementamos interfaces con clases que desciendan de TInterfacedObject, entonces jamás deben mezclarse referencias a un objeto con referencias a la interfaz. De hecho, la idea de las interfaces es nunca manipular directamente el objeto, sino sólo a través de la interfaz. // Saludos |
#2
|
||||
|
||||
Tienes toda la razon Roman...
Estaba mezclando las cosas en la cabeza....
__________________
El malabarista. |
#3
|
|||
|
|||
![]() Muchisimas gracias de nuevo.
Ahora sí que me ha quedado todo claro. ![]() Ahora entiendo el mensaje de error que había empezado a aparecerme cuando se cerraba la aplicación y que no era capaz de localizar. Era porque yo ejecutaba la llamada a Free cuando yo ya no necesitaba el objeto, y luego al cerrarse el programa, éste intentaba volver a ejecutar esos mismos Free gestionados por el _Release. ![]() No obstante, me gusta ser yo quien tenga el control y no fiarme de lo que automáticamente vaya a hacer el programa. Prefiero ser yo quien llame a Create y a Free en vez de esperar a que lo haga el propio programa. Además, este código fuente puede variar en los proximos meses y, llegado ese momento, tanto yo como cualquiera de mis compañeros de trabajo tendríamos que acordarnos de este detalle del Free "automático" para este caso tan partícular. Demasiado riesgo fiarse de la memoria humana. Así que, aunque sólo sea por esta vez, no voy utilizar el TInterfacedObject ya que voy a ser yo quien llame al Free, y la liberación de memoria va a quedar garantizada. ![]() De nuevo muchísimas gracias. Me habéis ayudado muchísimo. Sois unos cracks. |
#4
|
||||
|
||||
Flecha, no te doy la razón al completo, mira este código:
¿qué hay en el combo?.... Hombreeeee solo hay 'nombre2' porque al asignar la propiedad Text se hace internamente un Clear de los items....¿y si no sabes eso?...pues lo tendrás que aprender, así de claro. Con esto quiero decir, que si usas un objeto y se libera automáticamente, añade un comentario a la línea donde se crea y pon que se destruye solo, así tanto tú como tus compañeros sabéis lo que hacéis. Useasé, os acomodáis a los nuevos conceptos, los usáis y todos tan contentos. Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
![]() |
|
|
![]() |
||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Ventana MDI, "Siempre visible" y "Pantalla completa" | ixMike | API de Windows | 7 | 11-04-2007 18:36:55 |
¿cuál es mejor: "close" o "application.terminate"? | unreal4u | Varios | 5 | 05-03-2007 11:01:19 |
"ChequeaEsto" elegido el futuro "Killer CLubDelphi" | mamcx | Noticias | 51 | 31-10-2006 20:56:32 |
Firebir y usar "IF" en la clausula "SELECT" | papulo | SQL | 6 | 25-07-2006 21:38:04 |
porque no me reconoce los caracteres "*" ni "%" cuando filtro | mrmago | Conexión con bases de datos | 10 | 27-01-2006 04:21:16 |
![]() |
|