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?
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?
La mémoire est libérée. (C'est, aucune fuite de mémoire!)
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
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. –
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. –
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.
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. –
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. –
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. –
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. –
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é. –
@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. –