例如,在计算树的高度时,请参阅 int * heights = malloc(sizeof(int)...)。它是递归的,所以如果有内存泄漏,它会很大,有一棵大树。我知道一般规则是对每个malloc使用free(),但是这也适用于动态分配的原始类型吗?
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;
}
}
答案 0 :(得分:5)
是
否则,内存如何被释放?
答案 1 :(得分:5)
除了你分配的东西的类型与你是否需要释放它没有关系之外,根本不需要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;
}
答案 2 :(得分:4)
以防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()
对应项。
答案 3 :(得分:2)
您使用malloc
调用的任何内容都应由free
()显式提供。 malloc()
只是为你分配了一块内存,当你完成使用它时,由你自己来告诉操作系统。
查看malloc()
C不是垃圾收集,你知道;)