2016-08-30 1 views
-1

У меня есть следующий код, это вызовет утечку памяти, после возвращения функции, есть много mallocated памяти, не востребованы?Указатель malloc вызывает утечку памяти?

#include <stdlib.h> 

struct test 
{ 
    char * name; 
    char * value; 
}; 

void test_ok() 
{ 
    int i; 
    struct test * ok; 

    for (i=0;i<10000;i++) 
    { 
     ok =malloc(sizeof(struct test)); 
    } 

} 
void main() 
{ 
    int j=0; 
    while(j<60) 
    { 
     test_ok(); 
     j++; 
     sleep(1); 
    } 

} 
+2

'test_ok' не называется .... – LPs

+2

Ваш код не делает ничего, кроме как потратить циклы процессора. – tkausl

+0

oops, только что добавленный вызов функции. –

ответ

3

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

Любой достойный компилятор будет оптимизировать код test_ok(), во всяком случае.


EDIT:

Если вы на самом деле сделать вызов test_ok() из main(), он в конечном счете вызвать функцию, выделить память с помощью вызова malloc() [при условии, таНос успех] и ничего не делать. Итак, теоретически, да, у вас там будет утечка памяти, много.

Точка отметить: Как вы упомянули,

[...] после того, как функция возвращает [...]

если вы говорите о test_ok() функции, нет, просто возвращаются от функции с указателем malloc-ed не вызывает утечку памяти. Утечка происходит, когда вы пропустите, чтобы освободить память после ее использования (без ссылки/больше не используется).

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

Сказанное, согласно последним стандартам, void main() не является допустимым сигналом для размещенных сред, вы должны использовать, по крайней мере, int main(void).

1

Нет, если вы на самом деле не звоните test_ok() с main().

2

Вы программируете не звоните test_ok(), поэтому ответ нет.

Если бы вызывали test_ok(), ответ был бы да. Вы выделяете память в куче, используя malloc, а затем не очищаете ее с помощью free.

EDIT: Теперь OP был отредактирован для вызова test_ok(), так что да, эта программа будет утечка памяти.

1

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