Это не так. Поместите его в цикл и убедитесь сами: память процесса не увеличивается с каждой итерацией цикла.
for(1 .. 10_000_000)
{
our @a = (1);
our @b = (1);
}
Все, что "утечка" сообщения (вероятно) говорит вам, что программа закрылась с выдающимися переменными. Чтобы заставить замолчать это сообщение, неопределите переменные до конца программы:
perl -MDevel::LeakTrace::Fast -e 'our @a = (1); our @b = (1); undef @a; undef @b;'
FWIW, то же сообщение напечатано в perl 5.10.0, поэтому я не уверен, что обновление perl - это ответ.
Что касается того, почему сообщение появляется в некоторых случаях, но не в других, это, вероятно, каприз Devel :: LeakTrace :: Fast. Многие модули обнаружения утечек в Perl имеют «идиосинкразию» (мягко говоря), как это.
Итог: единственный 100% надежный способ проверить утечку - это увидеть, увеличивается ли использование памяти при повторном выполнении кода, о котором идет речь. Если вы сомневаетесь, вернитесь к этому.
Однако могут помочь различные модули Devel :: *. Но сначала лучше изолировать код утечки: отключите половину кода и посмотрите, сохраняется ли утечка. Теперь вы сузили свой поиск вдвое. Повторите это несколько раз, и вы быстро перейдете к функции или оператору, которые дают утечку. Затем посмотрите, не утек ли этот код, если поместить его в отдельный скрипт. Наконец, чтобы понять, почему происходит утечка, используйте модули Devel :: (например, проверка циклов памяти с помощью Devel :: Cycle ).