например, при расчете высоты дерева см. 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;
}
}
Помимо того факта, что тип объекта, который вы выделяете, не имеет отношения к тому, нужно ли вам его освобождать, нет необходимости в 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;
}
Да.
Иначе как освободится память?
На всякий случай 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()
коллега.
Все, что вы звоните с malloc
должно быть free
() сделал бы вы явно. malloc()
просто выделяет кусок памяти, и вам остается только сообщить ОС, когда вы его используете.
Взгляните на справочную страницу для malloc()
С не мусор, вы знаете;)