this stack has a memory leak. Find the cause and apply fix:
using System;
class MtStack{
private Object[] elements;
private int size = 0;
public MyStack(int initialCapacity){
elements = new Object[initialCapacity];
}
public void Push(object o){
EnsureCapacity();
elements[size++] = o;
}
public object Pop(){
if(size == 0){
throw new InvalidOperationException();
}
return elements[--size];
}
private void EnsureCapacity(){
if(elements.Length == size){
Object[] old = elements;
elements = new Object[2*size + 1];
old.CopyTo(elements,0);
}
}
}
=====================
🔍 Problem: Memory Leak in Pop()
In your class:
public object Pop(){
if(size == 0){
throw new InvalidOperationException();
}
return elements[--size]; // ❗ Leak: object reference remains in elements[size]
}
The popped object is no longer logically in the stack, but its reference still exists in the internal elements[]
array. This prevents the garbage collector from freeing it, especially for large or complex objects.
✅ Fix: Clear the Reference After Pop
You need to null out the reference after decrementing size
:
object obj = elements[--size];
elements[size] = null; // ✅ Clear reference to avoid memory leak
return obj;
✅ Corrected Full Code
using System;
class MyStack
{
private Object[] elements;
private int size = 0;
public MyStack(int initialCapacity)
{
elements = new Object[initialCapacity];
}
public void Push(object o)
{
EnsureCapacity();
elements[size++] = o;
}
public object Pop()
{
if (size == 0)
{
throw new InvalidOperationException("Stack is empty");
}
object obj = elements[--size];
elements[size] = null; // ✅ Clear reference
return obj;
}
private void EnsureCapacity()
{
if (elements.Length == size)
{
Object[] old = elements;
elements = new Object[2 * size + 1];
old.CopyTo(elements, 0);
}
}
}
🧪 Test Example
public static void Main()
{
MyStack stack = new MyStack(2);
stack.Push(new object());
stack.Push(new object());
stack.Pop(); // now the reference is cleared
}
✅ Summary
Issue | Fix |
---|---|
Reference held after Pop() |
elements[size] = null; |
Prevents GC from reclaiming memory | ✅ Fix clears unused object references |
Aucun commentaire:
Enregistrer un commentaire