2013-09-24 3 views
3

Этот вопрос такой же, как в заголовке: Возможно ли произвести утечку памяти без использования каких-либо конкретных средств ядра, таких как malloc, new и т. Д.?Возможно ли утечку памяти без использования malloc?

Что делать, если я создам связанный список внутри функции с множеством элементов, а после этого я выйду из этой функции, не очищая список. Список будет создан без использования каких-либо таНос вызовов, т.е.

struct list_head { 
    struct list_head *next, *prev; 
} 

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

Тема: Если вы не используете какой-либо конкретный malloc или новые вызовы, вы не получите утечку памяти кучи. Никогда. Это правильно?

+0

Ни одна строка в вашем примере не находится в стеке. Для первого это только * указатель *, который находится в стеке, фактическая строка находится где-то в другом месте. Второй ('string2') * был бы * включен в стек, если вы назначили его в объявлении, но теперь у вас есть только ошибка компиляции. –

+0

Jist вопроса выглядит как [what-and-where-are-the-stack-and-heap? Какая разница?] (Http://stackoverflow.com/questions/79923/what-and-where- «Стоп-стоп-куча». [Где идет струнный литерал?] (http://stackoverflow.com/questions/2589949/c-string-literals-where-do-they-go) –

+0

Что касается утечки , Только если вы что-то выделяете, но никогда не выделяете его, у вас будет утечка. Как открытие файла, но не закрытие его, или выделение памяти с помощью 'malloc' или' new', но не освобождение его с помощью 'free' или' delete'. –

ответ

12

A Утечка всегда подключен к ресурсу. Ресурс по определению является тем, что вы приобретаете вручную, и что вы должны освобождать его вручную. Память - яркий пример, но есть и другие ресурсы (файлы, блокировки мьютексов, сетевые подключения и т. Д.).

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

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

+0

«не имеет ресурсов» может сделать с более тщательной формулировкой. Это, безусловно, _refers_ к ресурсам (поэтому код «имеет» ресурсы «продолжается»). Тем не менее, он не работает (показывается) _own_. Мы не можем точно сказать, потому что назначение в список может (по документации/определению) отдавать право собственности на узлы на список. – sehe

+0

@sehe: Никакая часть кода OP не получает никаких ресурсов, поэтому я бы назвал это «без ресурсов» - все данные, используемые этим кодом, предоставляются средой. Однако я перефразирую. –

+0

Спасибо, это намного яснее. +1 – sehe

1

Переменные, которые вы применяли без malloc или new, находятся в стеке место в памяти. Поэтому, когда функция вернулась, переменная взята обратно.

С другой стороны, память, которую вы применили с помощью malloc или new, находится в , расположенной в кучном пространстве. Системе все равно, освободите ли вы место или нет. В этой ситуации, если вы не используете бесплатное или удаленное, произойдет утечка памяти .

0

malloc() выделяет память из кучи, в то время как пространство для строки и структуры литералов (string1, string2 и те list_head «) будут защищены во время компиляции в стеке.

Фактически любая память, выделенная для программы (куча или стек), будет восстановлена ​​ядром при выходе процесса (по крайней мере, в системе * nix).

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

Существуют стандартные функции (например, strdup), которые будут выделять память на кучу, остерегайтесь их.

1

Тема: Если вы не используете какой-либо конкретный malloc или новые вызовы, вы не получите утечки памяти кучи. Никогда. Это правильно?

Это предположение не совсем корректно. Проблема в том, что сама операционная система (или другие сторонние компоненты, на которые вы должны положиться) также может иметь утечку памяти. В этом случае вы не можете активно вызывать malloc, но вызывать другие (операционные системы) функции, которые могут протекать.

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

Таким образом, ответ на этот вопрос ...

Можно ли сделать утечку памяти без использования таНоса?

... это:

Да, это возможно.

0

Другой пример ресурса, который можно выделить и забыть освободить:

Если вы используете OpenGL, и вы называете glGenBuffers() миллион раз без соответствующих glDeleteBuffers вызовов, это весьма вероятно, что вы будете выбежать VRAM, и ваш графический драйвер начнет протекать в системную память.

Я только что это произошло. К счастью, профилировщик памяти Visual Studio сделал это довольно легко найти. Это проявилось в большом количестве распределений внешнего процесса nvoglv32.dll, который является моим драйвером NVIDIA OpenGL.

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