2015-01-14 3 views
2

Это утечка памяти в текущем C-коде?Это утечка памяти в следующем C-коде?

#include <stdlib.h> 
int *a; 

int main() { 
     a = malloc(sizeof(int)*10); 
     return 0; 
} 
+2

Нет, все в порядке. – StackedCrooked

+5

Да, ваш код просачивается блоком размером в десять целых чисел. Однако, поскольку он сразу же выходит, память возвращается обратно в ОС, поэтому никто не заметит, кроме valgrind. – dasblinkenlight

+0

Чтобы получить утечку, вам нужно иметь ее в функции, которая вызывается в длинном цикле. –

ответ

7

По крайней мере, как большинство людей используют этот термин, то ответ будет да - любая память, выделенная программой и не освободила считается утечка.

В то же время, большинство людей в первую очередь обеспокоены утечками - те, которые могут/будут периодически увеличивать объем памяти по мере запуска программы, например, выполнять выделение внутри цикла и не освобождать ее Память.

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

+0

Я пишу статический анализатор для обнаружения утечек памяти. Мне интересно, следует ли сообщать о предупреждении в таком случае. –

+0

@ZhaopengLi: Я бы сказал, да, по крайней мере, разрешить сообщить об этом, но, вероятно, разрешить пользователю отключать отчетность, если это необходимо, особенно если каждый прогон приводит к утечке небольшого, постоянного набора блоков. Как правило, утечки, которые варьируются между сериями, скорее всего, более интересны. –

+0

спасибо за ваш конструктивный совет. В нашем инструменте каждый текущий результат приводит к такому же результату. (Не выбрано никакого случайного пути) –

2

, поскольку программа завершается, как только он выделяет то Linux (или Windows) автоматически free, что объем памяти, поэтому нет никакой утечки, но вы должны были сделать вещи после malloc и до окончания программы, то будет утечка

+2

Память, выделяемая 'malloc', которая явно не освобождается' free'd, не гарантируется восстановлением ОС - такое поведение не требуется по стандарту C. Однако я не буду понижать это, потому что вы упомянули linux и windows. –

2

Это будет сообщено valgrind и Intel Inspector, поскольку утечка памяти, поскольку выделенная память не освобождена. Однако, возможно, это может не повлиять на программу.

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

Однако, если такие распределения теряются и никогда не используются, а дизайн их не рассматривает, то это определенно утечка.

Теперь в вашем случае эта выделенная память используется не где. Следовательно, такие распределения должны рассматриваться как утечки.

Возможно, что ОС удалит всю память, когда программа выйдет. Это нельзя делать само собой разумеющимся, когда приложение должно работать в течение длительного времени (например, серверные приложения) и будет существовать очень долго и в будущем будет иметь много обслуживания.

+1

Прежде чем я разместил этот вопрос, я немного смущен. Теперь, я думаю, я ясно понимаю эту тему. Благодаря! –

1

Да, в вашей программе есть утечка памяти. Вы выделяете память размером 10 * 4 [считает int занимает 4 байта], и вы не освобождаете память. Чтобы избежать утечки памяти, вы должны освободить выделенную память.

#include <stdlib.h> 
    int *a; 

    int main() 
    { 
     /* allocating the Memory */ 
     a = malloc(sizeof (int) *10); 
     /* free the allocate memory */ 
     free (a); 
     return 0; 
    } 
Смежные вопросы