c-我是否在结构指针上正确调用了free()



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

void test() {
    VariableVector *labelVector = initVariableVector();
    VariableVector *variableVector = initVariableVector();
    // do some stuff with labelVector and variableVector
    free(labelVector);
    free(variableVector);
}

这就是我的structinit方法的样子:

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 ;
    }
}

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

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

你也应该有摧毁它的功能。

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

EDIT:您没有检查VariableVector结构中成员"variables"的内存分配是否成功。这意味着即使在最后你也没有手动释放它,所以它会导致内存泄漏。

我的建议:使用"init*"函数,但同时使用"free*"函数。它使代码更加清晰,并负责所有内存释放。

initVariableVector,相反的应该是freeVariableVector

后一个函数可能看起来像:

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

相关内容

  • 没有找到相关文章

最新更新