Une question très simple: Ma question est, suis-je créé une fuite de mémoire ici (avec la chaîne Merci! P> P> code>)? Dois-je appeler
data.str: = ''; code> avant d'appeler
Dispose code>? P>
4 Réponses :
Non, vous n'êtes pas, la chaîne nettoie sa propre mémoire elle-même lorsqu'elle est supprimée. P>
En fait: les cordes se libèrent lorsque la structure englobante est finalisée.
Non, Dispose code> Free correctement des chaînes et des tableaux dynamiques dans des enregistrements, y compris ceux imbriqués.
getMem code> /
freemem (données) code> créerait une fuite de mémoire, en effet. p>
Ajoutez des variantes, des interfaces comptées de référence et peut-être même des fonctions anonymes à la liste, je pense que tout ce qui est compté est publié sur Dispose () code>.
GetMem / Freemem demanderait à appeler finaliser (). Vérifiez finaliser dans l'aide pour une explication sur ce qu'elle fait lors de l'élimination () ne peut pas être utilisée.
@LDSANSON: NOUVEAU = GETMEM + INITIALIZEZ ET DISPOSER = Finalize + Freemem - Vérifiez System.PAS. Ce sont juste des wrappers aux deux fonctions.
Si vous voulez une fuite de mémoire, AFaik vous devez utiliser des objets TP :-) Ils sont AFaik les seuls types structurés dans Delphi qui ne sont pas initialisés / finalisés P>
Les objets TP sont initialisés. Ils sont traités de la même manière que des enregistrements. Nous les avons effectivement utilisés de manière approfondie jusqu'à ce que DelphI ajout de la prise en charge des enregistrements avec des méthodes.
Enregistrement ou objet Ne crée pas de fuites de mémoire si vous utilisez des matrices dynamiques ou sur la pile, ce qui est très courant. Seulement avec une allocation de tas est nécessaire neuf () et disposer (). Il n'est pas très difficile d'utiliser un nouveau (Arecordpointer) que AnoObject.Create ...
groups.google.com/group/comp.lang. pascal.delphi.misc / msg / ... a admis, il va pour les objets TP qui ont une VMT. Donc, l'utilisation d'un enregistrement est correcte, d'utilisation comme objet non
C'est une fuite de mémoire si une exception est soulevée entre vos paires d'allocation / distribution. Il est normal de les protéger en tant que tel:
Vous devriez mieux allouer vos dossiers dans la pile, soit dans une matrice dynamique. Les deux initialiseront le contenu de chaque élément d'enregistrement. L'essai..finalement est obligatoire pour l'allocation de tas, comme un tobject.create a besoin d'un essai correspondant. Une telle tentative ... Enfin sera créée automatiquement par le compilateur si votre enregistrement est attribué via une matrice dynamique ou sur la pile.
@Arnaudbouchez allouez dans un tableau si vous souhaitez un tableau. Pas approprié si vous voulez un seul enregistrement. Allouer sur le tas avec Nouveau code> plutôt que la pile si la durée de vie de l'enregistrement doit survivre à la portée qui crée l'enregistrement.
@DavidHeffernan je mets +1 à votre réponse, qui est la bonne. Je voulais juste signaler une alternative. Utilisation de Nouveau / Dispose Code> Pour allouer des enregistrements sur le tas est bizarre, car vous avez
classe code> à la main juste à cet effet. Les pointeurs sur les enregistrements sont moins propres que l'instance code> code> - qui comporte l'ensemble du paradigme OOP, alors que l'enregistrement ne le fait pas.
@Arnaud peut-être. Si la structure est toujours allouée, une classe est sensible. Mais qu'en est-il d'une structure que vous souhaitez pouvoir allouer soit sur la pile ou sur le tas?