c内存泄漏问题

时间:2010-11-27 12:58:07

标签: c memory-management struct malloc free

我的项目中有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);

2 个答案:

答案 0 :(得分:3)

从您发布的片段中,没有泄漏。

我认为:

  

似乎它没有完全释放内存

你的意思是object仍然保留旧值。


deleteMarnix中,当您将objectPointer设置为NULL时,您只需在该函数范围内设置指针的值。

它不会在外部函数中设置实际指针object的值。

要做到这一点,你可以:

  1. 在外部函数中将其设置为NULL

    Object *object = createObject(21.0f, 1.87f);
    deleteMarnix( object );
    object = NULL;
    
  2. 将指针传递给指向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)。

虽然没有内存泄漏,但这可能会回答您的问题。

告诉我们:)