Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-04-2009
Avatar de josuk
josuk josuk is offline
Registrado
 
Registrado: abr 2009
Posts: 3
Poder: 0
josuk Va por buen camino
Question Liberar Objetos ¿Cómo resolver esto?

La creación de objetos se realiza sin problemas, en particular se trata de un objeto ”Casa” que contiene un array dinámico de objetos “Habitacion”.
Pero el problema es a la hora de liberarlos, dando error de violación de memoria.

¿Qué estoy haciendo mal?
¿Cómo debería hacerlo?

Si alguien lo consigue por favor decidme cómo!

Os pongo el código a continuación. Gracias compañeros.

...
Type
THabitacion = class (TObject)
Descripcion: string;
end;

TCasa = class (TObject)
Habitacion: array of THabitacion;
end;

var
Casa: TCasa;

implementation

procedure TForm1.BotonCrearClick (Sender: TObject);
begin
Casa:= TCasa.Create;
SetLength(Casa.Habitacion,1);
Casa.Habitacion[1]:=THabitacion.Create;
Casa.Habitacion[1].Descripcion:='Dormitorio';
end;

procedure TForm1.BotonLiberarrClick (Sender: TObject);
begin
Casa.Habitacion[1].Free;
Finalize(Casa.Habitacion);
Casa.Free;
end;
...
Responder Con Cita
  #2  
Antiguo 21-04-2009
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
De entrada recuerda que los arreglos dinámicos comienzan en cero, por lo que si asignas memoria para un sólo elemento:

Código Delphi [-]
SetLength(Casa.Habitacion,1);

entonces no es válido usar Casa.Habitacion[1]. Tendría que ser Casa.Habitacion[0].

Otra cosa: Por favor usa las etiquetas [delphi] para publicar código:


[delphi]

Aquí tu código

[/delphi]


// Saludos
Responder Con Cita
  #3  
Antiguo 22-04-2009
Avatar de josuk
josuk josuk is offline
Registrado
 
Registrado: abr 2009
Posts: 3
Poder: 0
josuk Va por buen camino
vaya, vaya

Muchas gracias Román, qué velocidad en responder!... y qué ridículo me siento ... efectivamente estaba utilizando un índice fuera de rango... y claro, por defecto Delphi no avisa de estos "detalles"...

El código que tengo entre manos realmente es bastante más complejo y cada objeto de los que he llamado Habitacion tienen a su vez varios arrays de objetos anidados y me volví loco buscando el error en algo menos "obvio" que un índice... bueno, no tengo excusa.

Entendido lo de las etiquetas

Gracias de nuevo!

PD.: Enhorabuena por este foro que ya había visitado en alguna ocasión y en el que por fín participo... espero ser útil en otra ocasión.
Responder Con Cita
  #4  
Antiguo 17-11-2009
gerardus gerardus is offline
Miembro
 
Registrado: dic 2007
Posts: 43
Poder: 0
gerardus Va por buen camino
Hola Josuk,

Tienes la opción de usar listas de objetos en vez de arrays:

Código Delphi [-]
  uses contnrs; // requerido por TObjectList

  TCasa = class (TObject)
  private
    FHabitaciones: TObjectlist;
    function GetHabitaciones(Index: integer): Thabitacion;
    function GetNumerohabitaciones: integer;
  public
    constructor create;
    destructor destroy override;
    function AddHabitacion : THabitacion;
    property Habitaciones[Index: integer]: Thabitacion read GetHabitaciones;
    property Numerohabitaciones: integer read GetNumerohabitaciones;
  end;



function TCasa.AddHabitacion: THabitacion;
begin
  Result := THabitacion.Create;
  FHabitaciones.Add(Result);
end;

constructor TCasa.create;
begin
  inherited Create;
  FHabitaciones := TObjectList.Create(True); // True destruye los objetos de la lista al ser destruido
end;

destructor TCasa.destroy;
begin
  FHabitaciones.Free;
  inherited;
end;

function TCasa.GetHabitaciones(Index: integer): Thabitacion;
begin
  Result := THabitacion(FHabitaciones[Index]);
end;

function TCasa.getNumerohabitaciones: integer;
begin
  Result := FHabitaciones.Count;
end;

Cordialmente,

Gerard.

Última edición por gerardus fecha: 17-11-2009 a las 10:57:54.
Responder Con Cita
  #5  
Antiguo 17-11-2009
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Ya puestos... ¿por qué no heredar de TobjectList?
Código Delphi [-]
unit Unit1;

interface

uses Contnrs;
type THabitacion = class(TObject)
  public
    id :integer;
end;


type THabitacionList  = class(TObjectList)
  private
    function GetItem(Index: Integer): THabitacion;
    procedure SetItem(Index: Integer; const Value: THabitacion);
  public
    function Extract(Item: THabitacion): THabitacion;
    function First: THabitacion;
    function Last:THabitacion;
    property Items[Index: Integer]: THabitacion read GetItem write SetItem; default;
  end;
  


implementation


{ THabitacionList }

function THabitacionList.Extract(Item: THabitacion): THabitacion;
begin
  result := THabitacion(inherited Extract(Item));
end;

function THabitacionList.First: THabitacion;
begin
  result := THabitacion(inherited First);
end;

function THabitacionList.GetItem(Index: Integer): THabitacion;
begin
  result:= THabitacion(inherited GetItem(Index));
end;

function THabitacionList.Last: THabitacion;
begin
  result := THabitacion(inherited Last);
end;

procedure THabitacionList.SetItem(Index: Integer; const Value: THabitacion);
begin
  inherited SetItem(Index, Value);
end;

end.

No es necesario todo el código... pero a mí me gusta así.

PD: Yo uso un experto de cnpacks que hice, sólo escribo "Habitacion" un clic de ratón... y se escribe todo eso.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #6  
Antiguo 17-11-2009
gerardus gerardus is offline
Miembro
 
Registrado: dic 2007
Posts: 43
Poder: 0
gerardus Va por buen camino
Cita:
Empezado por Lepe Ver Mensaje
Ya puestos... ¿por qué no heredar de TobjectList?
Es perfectamente valido.

Cita:
Empezado por Lepe Ver Mensaje
PD: Yo uso un experto de cnpacks que hice, sólo escribo "Habitacion" un clic de ratón... y se escribe todo eso.
Yo uso el ModelMaker Code Explorer, que tambien permite usar plantillas de clases predefinidas (Entre muchas otras cosas). Tendré que echar un vistazo al cnpack, a ver que tal.

Cordialmente,

Gerard
Responder Con Cita
  #7  
Antiguo 17-11-2009
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Arrow

Bueno.tambien si esta usando Delphi 2009 o superior tambien podria usar los generico especificando que tipo de dato introducira en la lista y sin codificar casi nada.
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #8  
Antiguo 17-11-2009
Avatar de josuk
josuk josuk is offline
Registrado
 
Registrado: abr 2009
Posts: 3
Poder: 0
josuk Va por buen camino
Thumbs up

Hola compañeros,

Gerardus, buena opción la que propones, ciertamente le da bastante formalidad y elegancia al planteamiento.

Y bueno Lepe, nada como optimizar, tanto la idea como el código.

Gracias por vuestro tiempo y punto de vista.
Responder Con Cita
Respuesta



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
Olvidar liberar punteros, objetos, etc. walito Varios 3 06-01-2008 01:51:47
Liberar Objetos II OscarG OOP 12 11-10-2005 10:13:55
liberar objetos OscarG OOP 13 06-10-2005 18:49:18
Liberar objetos que se han añadido a un TList neon OOP 3 07-10-2004 18:47:54
Liberar un matriz de objetos soul6301 Varios 8 04-08-2004 09:19:53


La franja horaria es GMT +2. Ahora son las 05:56:23.


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