mardi 2 septembre 2025

Find Memory Leak



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 size mais 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

  1. Corrige le nom des variables et méthodes :

    • lelementselements

    • LlengthLength

  2. Tu peux aussi ajouter un constructeur par défaut et des vérifications pour initCapacity <= 0.

  3. Pour une stack thread-safe, tu pourrais combiner avec lock ou utiliser ConcurrentStack<T>.



Aucun commentaire:

Enregistrer un commentaire

Find Memory Leak Lượt xem: