我的项目中有c函数,它创建一个结构并返回指针。
typedef struct object
{
float var1;
float var2;
}
Object;
Object *createObject(float newVar1, float newVar2)
{
Object *object; //create new structure
object = (Object*)malloc(sizeof(Object)); //malloc size for struct object
if(object != NULL) //is memory is malloc'd
{
object->var1 = newVar1; //set the data for var1
object->var2 = newVar2; //set the data for var2
return object; //return the pointer to the struct
}
return NULL; //if malloc fails, return NULL
}
现在结构被使用了一段时间后我想删除这个结构,我做了这个功能:
void deleteMarnix(Object *objectPointer)
{
free(objectPointer); //free the memory the pointer is pointing to
objectPointer = NULL; //stop it from becomming a dangling pointer
}
这个最后的代码片段展示了我如何创建一个对象,使用它并尝试删除它,但是,似乎它并没有完全释放内存。我做错了什么?
Object *object = createObject(21.0f, 1.87f);
//do things here with object.
deleteMarnix(object);
答案 0 :(得分:3)
从您发布的片段中,没有泄漏。
我认为:
似乎它没有完全释放内存
你的意思是object
仍然保留旧值。
在deleteMarnix
中,当您将objectPointer
设置为NULL
时,您只需在该函数范围内设置指针的值。
它不会在外部函数中设置实际指针object
的值。
要做到这一点,你可以:
在外部函数中将其设置为NULL
Object *object = createObject(21.0f, 1.87f);
deleteMarnix( object );
object = NULL;
将指针传递给指向deleteMarnix
函数的指针:
void deleteMarnix(Object **objectPointer)
{
free(*objectPointer); //free the memory the pointer is pointing to
*objectPointer = NULL; //stop it from becomming a dangling pointer
}
...
Object *object = createObject(21.0f, 1.87f);
deleteMarnix( &object );
答案 1 :(得分:2)
free()的作用是不完全释放指针所占用的内存,但如果我们在调用free()后调用malloc,它实际上可供以后使用。
有证据表明,在调用free并将指针设置为NULL之前,您将能够访问内存位置(假设您尚未调用malloc())。当然,值将重置为某些默认值。 (在一些编译器上,我发现int被设置为0)。
虽然没有内存泄漏,但这可能会回答您的问题。
告诉我们:)