Ai-je besoin de finaliser un tableau d'enregistrements dans Delphi?
Dans mon application j'ai l'enregistrement suivant:
TTransaction = record
Alias: string
Description: string
Creation: TDateTime
Count: Integer
end;
et je suis en utilisant ce record dans ce tableau:
Transactions = array of TTransaction;
Je vais garder le tableau chargés de cours de l'exécution, mais à un moment donné j'ai besoin d'effacer toutes les données et ajouter quelques nouvelles.
Suffit-il à utiliser:
SetLength(Transactions, 0); ?
Ou dois-je besoin de finaliser quelque chose ?
source d'informationauteur EProgrammerNotFound
Vous devez vous connecter pour publier un commentaire.
Il y a trois façons de libérer la mémoire associée à un tableau dynamique,
a
:C'est à vous d'en choisir un.
La la documentation dit la même chose, mais en un peu ronde au sujet de la mode:
Ce libère toute la mémoire associée à la matrice, y compris toutes les types gérés, tels que des chaînes, dynamique arrys etc. qui appartiennent à votre type d'enregistrement.
Si vous avez besoin de redimensionner le tableau pour une utilisation future, et que les nouvelles données soient disponibles, il suffit de redimensionner à l'aide de
SetLength
et initialiser les éléments restants de façon appropriée.Réglage de la longueur du tableau à zéro va détruire la matrice, ce qui va à l'encontre de votre volonté de "maintenir le réseau chargé." Cependant, il sera libérer de la mémoire pour tous les enregistrements et leurs chaînes (pour toutes les chaînes dont le nombre de références est 1 à l'époque).
Si vous voulez juste pour libérer de la mémoire pour les chaînes, mais gardez la trace de la mémoire allouée (parce que vous comptez allouer un autre ensemble d'enregistrements immédiatement après, et vous ne voulez pas que les déchets de la libération et de la ré-allocation de la mémoire), vous pouvez effacer uniquement la chaîne membres, mais il n'y a pas un seul appel de la bibliothèque de le faire pour vous. Au lieu de cela, vous aurez besoin d'écrire une boucle et claire de chaque enregistrement champs vous-même.
Si il y a beaucoup de champs dans l'enregistrement qui ont besoin de compensation, alors il peut être plus pratique d'affecter une valeur par défaut
TTransaction
de la valeur à chaque élément du tableau. Vous pouvez utiliser leDefault
fonction, ou dans les anciennes versions de Delphi, vous pouvez déclarer uneTTransaction
qui a tous ses domaines déjà clair:SetLength (transactions,0)
n'est pas une bonne idée. Je pense que la meilleure solution est de réinitialiser tout le dossier des membres. De cette façon, vous gardez la variable chargé.Vous pouvez utiliser
SetLength (transactions,0)
si vous n'avez pas besoin de la variable de plus, pour utiliser le moins de mémoire possible. Bien sûr, si vous avez besoin de nouveau quelque part dans le programme, vous pouvez ré-ajuster sa longueur, supposons que vous la connaissez.Vous n'avez pas besoin de finaliser quoi que ce soit, beause c'est un record, pas une classe. Enregistrements n'ont pas constructeurs ou destructeurscomme des classes.