Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Coloboración Paypal con ClubDelphi

 
 
Herramientas Buscar en Tema Desplegado
  #3  
Antiguo 16-01-2011
Avatar de yapt
yapt yapt is offline
Miembro
 
Registrado: sep 2006
Ubicación: España
Posts: 258
Poder: 20
yapt Va por buen camino
Hola Coso, ante todo, muchas gracias por dedicar tu tiempo......

Cita:
Empezado por coso Ver Mensaje
PD : mirando un poco mas...

Código Delphi [-]

for x := index to ColumnasActivas - 2 do
begin
Columna[x].Create( Columna[x+1] );
Columna[x+1].Free;
Columna[x+1] := nil;
end;


no deberias asignar directamente? (Columna[x] := Columna[x+1]) sin el create, me refiero. De la manera que lo estas haciendo estas creando otra columna, o sea, que el antiguo puntero se pierde.

Explico el motivo:

Justo antes del bucle FOR, lo primero que hago es liberar el objeto TDictionary ( Columna[index] ). Con lo que el nuevo Create, no debería dejar un objeto sin liberar (un Memory Leak).

Cada elemento del Array, en su forma Columna[x] referencia a cada uno de los objetos-lista genericos: TDictionary<>.
Según creo, la creación de una columna, pasando otra como parámetro debería hacer lo siguiente (en teoría):
1.- Crear una columna nueva (un nuevo objeto TDictionary, sin valores).
2.- Copiar los valores de la columna x+1 (un TDictionary) a la nueva columna x. Y digo copiar, no referenciar al otro objeto TDictionary.


Cita:
Empezado por coso Ver Mensaje
PDD : y mirandolo aun un rato mas : deberias no usar el free, sino hacer asignacion directa i liberar tansolo el ultimo.


Código Delphi [-]
for X := index to length(FColumnas) - 2 do
FColumnas[x] := FColumnas[x+1];

FColumnas[length(FColumnas)-1].FreeAndNil;

setlength(FColumnas,Length(FColumnas)-1);


Creo que asi te funcionaria.

De la manera que lo hacias, creabas una columna (x+1) cuya propietaria era Columna(x), que acababas de liberar...
Uno de los constructores de TDictionary, acepta una Colección como parámetro. Por ejemplo, otro objeto TDictionary (que es como lo hacía). Este constructor, lo que hace es una copia (que no referencia) de uno al otro.

Siempre en teoria, claro. :-)


Con el código que indicas, creo que sucedería lo siguiente. Partiendo de esta situación hipotética de ejemplo:

Columna[0] = TDictionary con Pointer: 1000.
Columna[1] = TDictionary con Pointer: 1001.
Columna[2] = TDictionary con Pointer: 1002.

Siguiendo el bucle que expones y suponiendo que borramos la número 0, quedaría así:
Columna[0] = 1001
Columna[1] = 1002

Y liberamos el objeto que apunta a 1002 (la Columna[2]), con lo que yo creo que tenemos:

1.- Un memory leak para el objeto que estaba en 1000 (pues no se ha liberado).
2.- Un invalid Pointer en cuanto queramos acceder a Columna[1], pues el objeto que estaba en 1002, ha sido liberado.

Pero claro.... todo esto, insisto, es lo que yo creo.

Muchas gracias Coso.... :-)

Última edición por yapt fecha: 16-01-2011 a las 20:34:11. Razón: Clarificación.
Responder Con Cita
 



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
Invalid Pointer Operation FerCastro Varios 3 23-02-2010 21:47:26
Invalid Pointer operation Dll mcarazas Varios 2 15-10-2008 21:45:14
Invalid Pointer operation Dll mcarazas Varios 0 15-10-2008 16:42:23
invalid pointer operation muppett Varios 1 05-03-2008 00:17:55
QR - Invalid Pointer Operation alapaco OOP 6 07-06-2006 22:43:31


La franja horaria es GMT +2. Ahora son las 11:06:02.


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