Как правильно освободить память, которая была выделена в функции?

Как правильно освободить память, выделенную под одномерный (либо двумерный) массив, возвращаемый функцией array_init(), чтобы избежать непредвиденного поведения?
  • 21 ноября 2023 г. 18:19
Ответы на вопрос 2
Для освобождения выделенной памяти в функции вам потребуется использовать функцию free(). 

Если массив был выделен в функции с помощью функции malloc(), то для освобождения памяти нужно использовать следующую конструкцию:

```c
void func() {
    int* array = (int*) malloc(sizeof(int) * N);
    
    // использование массива
    
    free(array);
}
```

Если массив был выделен в функции с помощью функции calloc(), то освобождение памяти будет аналогичным:

```c
void func() {
    int* array = (int*) calloc(N, sizeof(int));
    
    // использование массива
    
    free(array);
}
```

Если массив был выделен в функции с помощью функции realloc(), то освобождение памяти также будет аналогичным:

```c
void func() {
    int* array = (int*) realloc(NULL, sizeof(int) * N);
    
    // использование массива
    
    free(array);
}
```

Если возвращаемый функцией массив является двумерным, то освобождение памяти будет выполняться построчно:

```c
void func() {
    int** array = array_init();
    
    // использование массива
    
    for (int i = 0; i < N; i++) {
        free(array[i]);
    }
    
    free(array);
}
```
Вы можете управлять выделением и освобождением памяти в своем двумерном массиве с помощью функции array_deinit(). Эта функция освободит память, когда вы больше не планируете использовать массив. В С++, рекомендуется использовать классы для обертки таких функций и обязательно освобождать память в деструкторе. В современном С++, также рекомендуется использовать умные указатели для управления памятью вместо прямого использования операторов new и delete, кроме случаев, когда вы действительно нуждаетесь в полном контроле над аллокацией памяти.
Похожие вопросы