2013-07-30 5 views
0

Я хочу удалить весь массив. В настоящее время я делаю @array=(); Удаляет ли эти элементы и очищает память, сбор мусора? Если мне не нужно использовать Splice ?.Удаление элементов массива в Perl

+3

Я считаю, 'UNDEF @ array' идиоматичен, но то, что у вас есть дела тоже хорошо. – Nemo

+0

Возможный дубликат [Что является лучшим способом удалить значение из массива в Perl?] (Http://stackoverflow.com/questions/174292/what-is-the-best-way-to-delete-a- value-from-an-array-in-perl) –

+0

Кажется, что это не связано с удалением одного значения, если он пытается отменить весь массив. – Joe

ответ

8
  • Очень странно, что вам нужно это сделать. Правильное использование my означает, что очень редко требуется очистить массив.

  • @array =(); освобождает элементы и при необходимости вызывает любые деструкторы. Другими словами, элементы будут собирать мусор (до завершения операции), если они не используются в другом месте, по желанию.

  • @array =(); не освобождает базовый буфер массива. Это хорошая вещь. undef @array; заставит память освободиться, что приведет к многочисленным выделениям, когда вы начнете вкладывать больше элементов в массив.


Так,

  • Если вы хотите освободить массив, потому что вы никогда не будете использовать его снова, ограничить сферу его применения, где вам это нужно, помещая my @array; в правильном месте ,

    { 
        my @array; 
        ... 
    } # Elements of @array garbage collected here. 
    
  • Если вы хотите очистить массив вы будете использовать повторно использовать @array =();.

    my @array; 
    while (...) { 
        if (...) { 
         push @array, ...; 
        } else { 
         ... use @array ... 
         @array =(); # Elements of @array garbage collected here. 
        } 
    } 
    
  • Не используйте undef @array;.


Вы можете использовать splice, если это удобно.

say for @array; 
@array =(); 

может быть написана как

say for splice(@array); 

Но это не влияет на сбор мусора.

+0

Спасибо большое за информацию. Я делаю цикл while, который вы разместили повторно, используя массив и очистив его до конца цикла. Я был обеспокоен тем, что если это не сбор мусора и память не освобождена, я собираюсь разгрузить память в цикле while. вы упомянули, что память не освобождается, когда я делаю @ array =(). Означает ли интерпретатор perl его только для сбора мусора? Когда я повторно использую массив, он перезаписывает ранее выделенную память и использует ее? – Arav

+0

* Означает ли интерпретатор perl его только для сборки мусора? * Массив не может быть GC'ed, поскольку он все еще используется, даже если он пуст. * Когда я повторно использую массив, он перезаписывает более раннюю память, выделенную и используемую? * Да. Изменение массива изменяет память, используемую этим массивом. – ikegami

+0

Может быть, вы думаете, ''() 'создает массив? Это не так. Это ничего не создает. Это просто заполнитель, чтобы ничего не значить. 'my @array;' создает массив. '[]' также создает массив (и возвращает ссылку на него). – ikegami

1
@array =(); 

прекрасно, вы можете также использовать

undef @array; 

Обратите внимание, что это не так :

@array = undef; 

это будет иметь значение undef

+0

Другим вариантом будет '$ # array = -1', который усекает массив. Но я бы не рекомендовал этого. – amon

+0

Большое спасибо за информацию – Arav

1

Если ваша цель - освободить память обратно в ОС, вам, вероятно, не повезло.Если ваша цель состоит в том, чтобы сделать память доступной для вашей программы perl, чтобы использовать ее снова, тогда все ответы будут хорошими.

Для получения более подробной информации некоторых проверьте следующие ссылки
http://www.perlmonks.org/?node_id=243025
In Perl, how can I release memory to the operating system?

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