1️⃣ Code que tu as donné (corrigé pour la syntaxe)
class MyStack
{
private object[] elements;
private int size = 0;
public MyStack(int initCapacity)
{
elements = new object[initCapacity];
}
public void Push(object o)
{
EnsureCapacity();
elements[size++] = o;
}
public object Pop()
{
if (size == 0)
throw new Exception("Stack is empty");
return elements[--size];
}
private void EnsureCapacity()
{
if (elements.Length == size)
{
object[] old = elements;
elements = new object[2 * size + 1];
old.CopyTo(elements, 0);
}
}
}
2️⃣ Pourquoi il y a un memory leak
Le problème vient de cette ligne dans Pop() :
return elements[--size];
-
Tu réduis
sizemais tu ne supprimes pas la référence dans le tableau. -
Donc
elements[size]contient toujours une référence à l’objet poppé. -
Le Garbage Collector ne peut pas libérer cet objet, car il y a encore une référence dans le tableau.
💡 Même si tu as “retiré” l’élément logiquement, le tableau garde la référence → fuite mémoire.
3️⃣ Solution : mettre la référence à null après Pop
public object Pop()
{
if (size == 0)
throw new Exception("Stack is empty");
object result = elements[--size];
elements[size] = null; // <-- libère la référence
return result;
}
-
Maintenant, l’objet poppé peut être garbage-collected.
-
Plus de fuite mémoire.
4️⃣ Autres recommandations
-
Corrige le nom des variables et méthodes :
-
lelements→elements -
Llength→Length
-
-
Tu peux aussi ajouter un constructeur par défaut et des vérifications pour
initCapacity <= 0. -
Pour une stack thread-safe, tu pourrais combiner avec
lockou utiliserConcurrentStack<T>.
Aucun commentaire:
Enregistrer un commentaire