2010-06-24 20 views
14

dans cet exempleUn tableau dynamique est-il automatiquement désalloué lorsqu'il est hors de portée?

procedure foobar; 
var tab:array of integer; 
begin 
    setlength(tab,10); 
end; 

est le tableau détruit ou la mémoire fuit?

+0

Bien qu'il ne faille pas, vous devriez vraiment libérer vos propres variables. Effectuez SetLength (onglet, 0); c'est une ligne supplémentaire. Si vous êtes inquiet à ce sujet alors enveloppez-le dans un bloc try/finally. –

+2

Je ne peux pas approuver ce conseil, @Ryan. Est-ce que vous effacez manuellement toutes vos variables de chaîne, aussi? Quand je vois du code assigner des valeurs à des variables qui ne sont jamais utilisées à nouveau, cela m'indique que le programmeur ne comprend pas vraiment le fonctionnement de la langue. En particulier, le compilateur place déjà un bloc try-finally autour du corps de la fonction pour s'assurer que la variable dynamic-array est nettoyée. Mettre dans l'un des vôtres est exagéré. –

+0

@Ryan, c'est juste faux. L'appel à SetLength est un gaspillage total, à la fois de touches et d'un appel de fonction inutile à l'exécution. Les tableaux dynamiques sont gérés par le compilateur et seront libérés automatiquement lorsqu'ils sortiront du cadre. –

Répondre

14

La mémoire est libérée. (C'est, aucune fuite de mémoire!)

+4

Les éléments sont également libérés si ceux-ci sont également gérés par le compilateur (tableaux dyn, chaînes, intf, enregistrements avec de tels types, etc.). – alex

+1

Pour "tab: array of Integer", tout est libéré. Pour "tab: array of TObject", ou toute autre classe, vous devez libérer les objets vous-même. –

+0

Vrai, @Warren, mais cela n'a rien à voir avec le tableau. Le même conseil s'applique à un scalaire ordinaire. Les objets doivent être libérés. les entiers ne le font pas. –

1

Le tableau est automatiquement libéré, mais j'ai vu des cas obscurs où ce n'est pas pour une raison quelconque. Je l'ai résolu en mettant le tableau à zéro.

+6

Il n'y a que deux raisons pour lesquelles il ne serait pas libéré. Soit vous faites quelque chose d'effrayant avec des pointeurs qui gâchent le comptage des références, soit le tableau appartient à un objet ou à un enregistrement qui fuit aussi. –

+0

Je sais, d'une manière ou d'une autre, il y avait quelque chose d'autre qui ne le rendait pas auto-libre. J'aimerais avoir encore l'exemple pour le prouver! Mais je ne le fais pas. –

+0

Ce serait un bug dans le code-gen du compilateur. Ou peut-être que c'était un threadvar? L'aide indique clairement que le type géré utilisé en tant que threadvars ne se libère pas automatiquement et que vous devez le faire manuellement. –