2016-07-21 4 views
0

Я знаю, как бы это сделать на C++, но в Ruby я не уверен. В основном это структура, что я работаю с (за исключением, что вместо целых чисел, у меня есть 2 элемента массива, содержащиеся в массиве данных .)Этот массив Array.new в цикле создает утечку памяти?

data = [ 1, 2, 3 ] 

while true do 
    wrong = Array.new 
    data.each do |d| 
     print "Guess: " 
     guess = gets 
     if guess.strip.to_i == d 
      puts "Correct!" 
     else 
      puts "Sorry, the right answer is #{ d }." 
      wrong << d 
     end 
    end 

    if wrong.length == 0 
     break 
    else 
     data = wrong 
    end 
end 

Могу ли я создать утечку памяти, Array.new в каждом цикле? Есть ли более эффективный альтернативный подход?

Заранее благодарен!

+0

Я просто хочу убедиться, что я понимаю, что вы пытаетесь сделать. Вы хотите начать с списка номеров и догадаться, до тех пор, пока они не угадают каждый номер, затем не закончите или это что-то еще? – lwassink

+0

Пример кода - это именно то, что позволяет пользователю добираться до конца. Но основной вопрос: у меня есть контейнер, я беру некоторые вещи из него последовательно и продолжаю делать это до тех пор, пока он не станет пустым. Подход, который я принимаю, - это то, что нужно сохранить, до следующего цикла в другой контейнер. С каждым циклом я должен поменять эти контейнеры. Я знаю, как это сделать на C++, но в Ruby это немного непрозрачно для меня. Благодаря! – Dribbler

ответ

1

Рубин допускает параллельное назначение, поэтому поменять местами значения data и wrong так же легко, как

data, wrong = wrong, data 

Вы не создаете утечку памяти, вызвав Array.new, потому что рубин имеет автоматическую сборку мусора, поэтому он будет удалять старые массивы, когда программа больше не ссылается на них.

+0

Исправление: он удалит старые массивы _at неопределенной точки в будущем после того, как нет живых ссылок. –

1

Нет, у Руби есть сборщик мусора. Основная конструкция сборщика мусора заключается в том, что объекты проверяются, чтобы проверить, не вышли ли они из области видимости, как ваша «неправильная» переменная, и, если не ссылаются на другой объект, отмечены как удаленные (освобожденные).

Ruby и другие языки теперь имеют более сложные сборщики мусора, а те, кто работает на них для жизни, могут вызывать дыры в простом объяснении, которое я дал, но это основная идея.

Смежные вопросы