是免费的()动态分配C中必需的原始数组?

时间:2014-01-12 00:54:40

标签: c++ c arrays dynamic primitive

例如,在计算树的高度时,请参阅 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;
    }
}

4 个答案:

答案 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()

的手册页

enter image description here

C不是垃圾收集,你知道;)