2015-12-17 3 views
0

Сегодня я видел некоторый код, который я думаю, будет утечка памяти:Этот код будет утечкой памяти?

/* realloc example: rememb-o-matic */ 
#include <stdio.h>  /* printf, scanf, puts */ 
#include <stdlib.h>  /* realloc, free, exit, NULL */ 

int main() 
{ 
    int input,n; 
    int count = 0; 
    int* numbers = NULL; 
    int* more_numbers = NULL; 

    do { 
    printf ("Enter an integer value (0 to end): "); 
    scanf ("%d", &input); 
    count++; 

    more_numbers = (int*) realloc (numbers, count * sizeof(int)); 

    if (more_numbers!=NULL) { 
     numbers=more_numbers; 
     numbers[count-1]=input; 
    } 
    else { 
     free (numbers); 
     puts ("Error (re)allocating memory"); 
     exit (1); 
    } 
    } while (input!=0); 

    printf ("Numbers entered: "); 
    for (n=0;n<count;n++) printf ("%d ",numbers[n]); 
    free (numbers); 

    return 0; 
} 

Я думаю, что программа не может освободить всю память, на которую ссылается указатель numbers перед назначением нового значения этого указателя. Программа освобождает память, которую numbers указывает только на последнюю итерацию цикла.

+1

Вы выделяете хранилище для одного массива и свободное хранилище для одного массива. Выглядит хорошо, кроме этого кода C, а не C++. – NathanOliver

+2

'realloc' делает правильные вещи - если он выделяет новый блок, он освобождает старый. В C++ вы бы использовали 'std :: vector', который просто работает. –

+0

О, я сожалею, что это C. Я понял, «он освобождает старый» :) спасибо –

ответ

2

Функция realloc() выполняет следующие действия.

  1. предшествующего содержимое выделенной памяти копируется в новом распределение
  2. предварительного распределение передается free()
  3. адрес нового распределения возвращается.

Примечание: вышеизложенное происходит только в том случае, если функция realloc() может фактически выполнить новое распределение памяти. Если новое распределение памяти выходит из строя, возвращается NULL.

Так что у опубликованного кода нет утечки памяти, потому что функция: realloc() обрабатывает освобождение старого распределения памяти.

+0

Действительно, представленный код даже демонстрирует хорошее обращение с случаем, когда 'realloc()' терпит неудачу, несмотря на то, что он собирается выйти и тем самым освободить всю выделенную память в любом случае. –

0

Вышеупомянутый код не вызывает утечки памяти, как уже упоминалось. Поскольку это чистый код C, вы можете использовать реализацию C связанного списка (если вы не хотите, чтобы структуры C++ STL). Вы также увидите возможность выделения/освобождения памяти для еще одного целого во время выполнения!