Нужно ли освобождать динамические указатели внутри функции? - PullRequest
2 голосов
/ 17 ноября 2011

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

Спасибо

Ответы [ 4 ]

4 голосов
/ 17 ноября 2011

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

1 голос
/ 17 ноября 2011

Это зависит от того, где была выделена память, на которую ссылается указатель. Существуют два основных способа распределения пространства в C.

  1. Использование стека:

    void foo(){
        int stack_variable = 10;
        int *stack_pointer = &stack_variable; //bar shouldn't be freed.
    }
    
  2. Использование кучи:

    void foo(){
    
       int * heap_pointer = (int *) malloc(sizeof(int)); //heap_pointer need to be freed somewhere
    
    }
    

В первом случае проблем нет: память, выделенная в стеке, будет освобождена при возврате функции. Даже если вы используете указатель, и он указывает на некоторые данные в стеке, освобождение не требуется. Будьте осторожны, чтобы не использовать указатель на данные, размещенные в стеке, когда сами данные выходят за рамки:

int * foo(){
    int stack_variable = 10;
    int *ptr = &stack_variable;
    return ptr;
}
int * ptr = foo(); // you have a problem here: ptr points to a memory region that no longer exist!

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

1 голос
/ 17 ноября 2011

Поставьте лаконично: каждый указатель, который вы получаете от malloc, должен идти к free ровно один раз.Ни больше, ни меньше.

0 голосов
/ 17 ноября 2011

Если вы выделили данные с помощью malloc / calloc, вам нужно освободить данные.


Дополнение из-за любопытного комментария @Julia Childe:

Хорошо, смысл выделения динамической памяти состоит в том, что она будет оставаться там до тех пор, пока вы ее явно не освободите. Это позволяет вам передавать указатели как от функций, так и к функциям, и вы не ограничены областью действия конкретной функции, то есть main. Таким образом, вы можете выделить память для данных, когда вам нужно, а не заранее, таким образом, динамический память.

Если бы у нас не было этой способности, нам пришлось бы знать, сколько памяти мы использовали бы во время компиляции.

Надеюсь, это уберет некоторые знаки вопроса.

...