Является ли free () динамически распределяемыми примитивными массивами необходимыми в C?

например, при расчете высоты дерева см. int * heights = malloc (sizeof (int) …). Он рекурсивный, поэтому при утечке памяти он будет большим с большим деревом. Я знаю, что общим правилом является использование free () для каждого malloc, но относится ли это также к динамически размещаемым примитивным типам?

typedef struct EQTNode {
EQPos *pos;
int genNumber;
struct EQTNode * parent;
int numberOfPossibleMoves;
struct EQTNode ** children;
} EQTNode;

...

int EQTN_getHeight(EQTNode *node, int depth){
if (node != NULL){
int n = node->numberOfPossibleMoves;
int *heights = malloc(sizeof(int) * n);
for (int i = 0; i < n; i += 1){
heights[i] = EQTN_getHeight(node->children[i], depth + 1);
}
int max = 0;
for (int i = 0; i < n; i += 1){
if (heights[i] > max){
max = heights[i];
}
}
return max;
} else {
return depth;
}
}

1

Решение

Помимо того факта, что тип объекта, который вы выделяете, не имеет отношения к тому, нужно ли вам его освобождать, нет необходимости в malloc / free:

if (node != NULL){
int n = node->numberOfPossibleMoves;
int max = 0;
for (int i = 0; i < n; i++){
int height = EQTN_getHeight(node->children[i], depth + 1);
if (max < height)
max = height;
}
return max;
}
5

Другие решения

Да.

Иначе как освободится память?

5

На всякий случай C99 разрешает массивы переменной длины, поэтому ваш код можно переписать так:

   if (node != NULL){
int n = node->numberOfPossibleMoves;
int heights[n];
for (int i = 0; i < n; i += 1){
heights[i] = EQTN_getHeight(node->children[i], depth + 1);
}
int max = 0;
for (int i = 0; i < n; i += 1){
if (heights[i] > max){
max = heights[i];
}
}
return max;
}

В этом случае вам не нужно явно освобождать его.

Но каждый malloc() звонок должен иметь соответствующий free() коллега.

4

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

Взгляните на справочную страницу для malloc()

введите описание изображения здесь

С не мусор, вы знаете;)

2
По вопросам рекламы [email protected]