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