Bug #10191
Updated by nobu (Nobuyoshi Nakada) over 10 years ago
Steps: 1. (1) Run the following code (tested on Window 7): ~~~ruby class Leaky attr_accessor :v def leak; d = dup; d.v = nil; end end l = Leaky.new while true; l.leak; end ~~~ 2. (2) Watch the memory usage in Task Manager or equivalent Expected result: Infinite loop, memory usage fairly stable (as GC cleans up) Actual result: Interpreter consumes more and more memory, and eventually throws the following exception: "in `dup': failed to allocate memory (NoMemoryError)." Presumably, this is a memory leak. Workaround: If you manually set the instance variable before dup-ing, memory usage is stable. Accordingly, this code does not appear to leak memory: ~~~ruby class NonLeaky attr_accessor :v def leak; @v ||= nil; d = dup; d.v = nil; end end l = NonLeaky.new while true; l.leak; end ~~~