因此,在测试我的结构时,我使用以下方法。你可以看到我在方法结尾的指针上调用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 ;
}
}
答案 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);
}
}