Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos


Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-02-2007
Jome Jome is offline
Registrado
 
Registrado: Nov 2005
Posts: 8
Poder: 0
Jome Va por buen camino
Liberación de memoria

Hola.

Si en un objeto MyStrings de tipo TStrings hago esto ...

Código Delphi [-]
MyStrings.AddObject('Hola', TObject(StrNew(PChar('QueTal'))));

... ¿puedo luego liberar esa memoria que ha solicitado StrNew haciendo lo siguiente?:

Código Delphi [-]
//Suponemos que el elemento que hemos añadido tiene índice 1
MyStrings.Items.Objects[1].Free

¿O por el contrario tengo que hacerlo mediante StrDispose?
Responder Con Cita
  #2  
Antiguo 22-02-2007
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: Jul 2004
Ubicación: Barcelona - España
Posts: 15.657
Poder: 10
Neftali [Germán.Estévez] Tiene un aura espectacularNeftali [Germán.Estévez] Tiene un aura espectacular
La liberación me parece correcta y luego recuerda borrar el índice 1 (Delete), ya que ahora te ha quedado un String en la posición 1 con un apuntador a ¿???¿?.

Lo que no me ha quedado claro es esto (el CAST como TObject), pero bueno:
Código Delphi [-]
  TObject(StrNew(PChar('QueTal')))
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 22-02-2007
Jome Jome is offline
Registrado
 
Registrado: Nov 2005
Posts: 8
Poder: 0
Jome Va por buen camino
Cita:
Empezado por Neftali
La liberación me parece correcta y luego recuerda borrar el índice 1 (Delete), ya que ahora te ha quedado un String en la posición 1 con un apuntador a ¿???¿?.
Efectivamente, si no se elimina el elemento entero, habría que hacer .Objects[1] := nil

Cita:
Empezado por Neftali
Lo que no me ha quedado claro es esto (el CAST como TObject), pero bueno:

Código Delphi [-]
TObject(StrNew(PChar('QueTal')))
Es un cast para que acepte el puntero a la nueva cadena. A efectos prácticos, supongo que es equivalente a Pointer(StrNew(PChar('QueTal'))).

Lo que no entiendo muy bien es cómo haciendo .Objects[1].Free es capaz de liberar esa memoria, siendo que no se trata de un objeto creado mediante un constructor Create.
Responder Con Cita
  #4  
Antiguo 22-02-2007
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: Jul 2004
Ubicación: Barcelona - España
Posts: 15.657
Poder: 10
Neftali [Germán.Estévez] Tiene un aura espectacularNeftali [Germán.Estévez] Tiene un aura espectacular
Cita:
Empezado por Jome
Lo que no entiendo muy bien es cómo haciendo .Objects[1].Free es capaz de liberar esa memoria, siendo que no se trata de un objeto creado mediante un constructor Create.
Bueno, ahí está la cosa y tal vez el error; Piensa que con temas de memoria, no siempre "peta" cuando lo haces, sino que a veces "peta" cuando intentas acceder/liberar (y se de cuenta de que has accedido a una posición incorrecta).
El Free supongo que sabe cómo liberar un TObject o derivado porque almacena la información de la clase, en este caso, no se. No acabo de entender cómo se puede hacer un CAST de un Puntero como TObject. Un TObject, que yo sepa hay que crearlo (como tú bien dices) utilizando su constructor.
Otra cosa es que aproveches el puntero del TObject (propiedad Objects) y en lugar de poner ahí un TObject, pongas otra cosa; Correcto. Pero entonces no deberías tratarlo como un TObject (CAST) ni intentar liberarlo como tal.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #5  
Antiguo 22-02-2007
Jome Jome is offline
Registrado
 
Registrado: Nov 2005
Posts: 8
Poder: 0
Jome Va por buen camino
Nada, he comprobado que realmente no se puede liberar haciendo .Free
Entiendo que la razón será lo que hemos hablado, que el objeto no ha sido creado mediante su constructor Create y que, por tanto, me atrevo a decir que ni siquiera se trata de un objeto.
Al intentarlo salta una excepción de acceso a memoria, así que hay que liberar mediante StrDispose:

Código Delphi [-]
StrDispose(PChar(MyStrings.Items.Objects[1]));


Muchas gracias por la ayuda.
Un saludo.
Responder Con Cita
  #6  
Antiguo 22-02-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: May 2003
Posts: 7.424
Poder: 23
Lepe Va por buen camino
La lógica me dice que si reservas memoria mediante un método (strNew) debes usar una forma de liberarlo que sea compatible con la forma de reservar, esto es usar StrDispose.

El moldeo de tipos, yo lo veo como una característica muy potente, pero tú eres el responsable de "saber como usarlo".

Que no salte una excepción en la liberación, no quiere decir que realmente lo esté liberando correctamente.

La ayuda lo deja claro, StrNew llama a StrAlloc:
Cita:
Empezado por ayuda de StrAlloc
A 32-bit number giving the total amount of memory allocated is stored in the four bytes preceding the first character; it is equal to Size + 4. If space for a string is allocated with StrAlloc, it should be deallocated via StrDispose
Edito: Ya veo que llego tarde... como siempre .

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
reserva memoria c++ halizia C++ Builder 1 25-04-2006 18:09:52
Manejo de memoria rastafarey Varios 3 07-04-2005 20:16:18
Memoria Gandazgul Varios 2 08-05-2004 01:02:37
Liberar memoria de un QR. mlara Impresión 1 21-02-2004 18:31:16
Memoria susje Varios 18 23-07-2003 00:07:10


La franja horaria es GMT +2. Ahora son las 00:44:06.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi