Есть ли утечка хорошей памяти?

Возможный дубликат:
Происходит ли утечка памяти?

Я где-то читал, что бывают особые случаи, когда утечки памяти необходимы, а в некоторых редких случаях это хорошо. Но я не могу вспомнить, что именно было!

Кто-нибудь знает или помнит такой аргумент?

Спасибо, Ади


person Community    schedule 27.11.2008    source источник


Ответы (8)


Единственные ситуации, которые я могу придумать, когда была бы желательна утечка памяти, следующие:

(они все немного запутаны, кроме 1-го)

  • Академическая ситуация, когда утечка памяти была бы хорошим упражнением в классе программирования; включая отслеживание и предотвращение утечек.

  • Сценарий профилирования / тестирования, в котором мы хотели бы увидеть, как наше программное обеспечение ведет себя в условиях утечки.

  • Написание дырявого приложения для тестирования / отладки профилирующего приложения с помощью.

person Community    schedule 27.11.2008
comment
Хорошая мысль, я делал это раньше. Я запускал течеискатель на протяжении всего цикла модульного тестирования, и я намеренно допустил утечку блока из первого теста, чтобы доказать, что тестовый код правильно использовал течеискатель. Таким образом, 0 просочившихся блоков было провалом теста, как, конечно же, 2 или более. - person Steve Jessop; 27.11.2008

Вау, хотелось бы знать, где вы об этом слышали. Утечка памяти - это просто непреднамеренная утечка памяти, которая тратит ресурсы. Я не вижу причин для такого поведения, если только вы не создавали программное обеспечение, которое хотели бы использовать ваши соперники (как американцы сделали с русскими, когда они позволили им украсть программное обеспечение для управления трубопроводом)!

person Community    schedule 27.11.2008

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

Если вы хотите приблизиться к 100% покрытию кода с помощью автоматизированного модульного тестирования, вам придется придумать какой-то способ сделать конкретный запрос на выделение не соответствующим автоматическому модульному тесту (что легче сказать, чем сделать).

Как только у вас есть это, вам нужно написать модульный тест для каждого запроса на выделение, чтобы убедиться, что сбой нехватки памяти обрабатывается правильно для этого выделения (много работы).

person Community    schedule 27.11.2008
comment
Обычный способ сделать это AFAIK - заменить распределитель памяти на один, настроенный на сбой по сигналу. Пока ваш код достаточно детерминирован, тест сообщает распределителю о сбое в 17 выделениях, а затем запускает некоторый тестовый код, в котором выделение, которое вы хотите протестировать, является 17-м. Кропотливый. - person Steve Jessop; 27.11.2008
comment
Да, и вы бы не сделали этого только с 17, поскольку тогда любое изменение в тестируемом коде могло бы обойти тест, сделав критическое распределение 16-м или 18-м. Вы делаете это для всех n от 1 до такого количества, чтобы распределитель сообщал, что это не обязательно. - person Steve Jessop; 27.11.2008

Утечки памяти никогда не бывают нормальными. Иногда вам нужно выделить часть памяти, а не освобождать ее, потому что она понадобится позже, но это не утечка памяти. Но говорить, что утечка памяти позволяет избежать фрагментации памяти, - все равно что сказать, что сегодня лучше просто пропустить работу, не звоня, чтобы не опоздать.

person Community    schedule 27.11.2008

Я никогда не слышал о случаях, когда утечки памяти - это хорошо.

В современных операционных системах они не так плохи, как 5-10 лет назад. В то время операционные системы, которые намного хуже контролировали программы и утечки памяти, приводили к безвозвратной потере памяти до тех пор, пока ОС не была перезагружена.

В наши дни это не проблема. Таким образом, наиболее распространенные «утечки памяти» - это когда что-то не очищается должным образом из-за ошибок и случаев выхода из программы. Когда программа вот-вот завершится, обычно можно оставить память не освобожденной, потому что, когда программа прерывается операционной системой, все это будет происходить в любом случае.

Пока программа работает, я не могу придумать никаких причин, по которым вы хотели бы иметь утечку памяти.

person Community    schedule 27.11.2008
comment
Извините, 5 лет назад? IIRC, Windows XP SP1 (выпущенный в 2002 г.) имел кучи памяти для каждого процесса и не приводил к постоянной утечке памяти, выделенной пользователем (если вы не были драйвером устройства ofc). Я думаю, ты показываешь свой возраст ;-p - person Steve Jessop; 27.11.2008
comment
5 лет? Это было вечно назад :-P - person SoapBox; 27.11.2008

Они хороши, если вы - хостинговая компания, которая взимает $$$ ++ за обновление памяти на серверах.

person Community    schedule 27.11.2008

@ Ади Барда:

В конечном итоге проблемы с большим объемом памяти, потребляемым просочившимися объектами, перевесят проблемы фрагментации памяти.

person Community    schedule 27.11.2008

А как насчет того, чтобы избежать фрагментации памяти? разве это не достаточно веская причина?

person Community    schedule 27.11.2008