Hola Coso, ante todo, muchas gracias por dedicar tu tiempo......
Cita:
Empezado por coso
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
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.... :-)