我在结构指针上正确调用free()吗?

时间:2013-11-22 11:19:11

标签: c struct malloc free

因此,在测试我的结构时,我使用以下方法。你可以看到我在方法结尾的指针上调用free。这是对的吗?

void test() {

    VariableVector *labelVector = initVariableVector();
    VariableVector *variableVector = initVariableVector();

    // do some stuff with labelVector and variableVector

    free(labelVector);
    free(variableVector);
}

这是我的struct init方法的样子:

Variable* initVariable(char *variableName, char *arrayOfElements,
        int32_t address) {
    Variable* initializedVariable = malloc(sizeof(Variable));
    if (initializedVariable != NULL ) {
        initializedVariable->variableName = variableName;
        initializedVariable->arrayOfElements = arrayOfElements;
        initializedVariable->address = address;
        return initializedVariable;
    } else {
        return NULL ;
    }
}

VariableVector* initVariableVector() {
    VariableVector* initializedVariableVector = malloc(
            sizeof(VariableVector));
    if (initializedVariableVector != NULL ) {
        initializedVariableVector->size = 0;
        initializedVariableVector->capacity = VECTOR_INITIAL_CAPACITY;
        initializedVariableVector->variables = malloc(
                sizeof(Variable) * VECTOR_INITIAL_CAPACITY);
        return initializedVariableVector;
    } else {
        return NULL ;
    }
}

2 个答案:

答案 0 :(得分:2)

您的想法是正确的,但您的实施不是。

initVariableVector()为一个对象执行了2 malloc,但您只执行了1 free

你也应该有破坏它的功能。

void destroyVariableVector(VariableVector* vector)
{
    if(vector) {
        free(vector->variables);
        free(vector);
    }
}

答案 1 :(得分:1)

编辑:您没有检查结构VariableVector中成员“变量”的内存分配是否成功。这意味着即使在最后你也不会手动释放它,因此会导致内存泄漏。

我的建议: 使用“init *”函数,但同时使用“free *”函数。它使代码更清晰,并处理所有内存释放。

initVariableVector,相反应该是freeVariableVector

后者的功能可能如下:

void freeVariableVector(VariableVector *vv)
{
    if (vv) {
        if (vv->variables)
            free(vv->variables);
        free(vv);
    }
}