2010-11-27 116 views
0

我在我的项目中创建一个结构并返回指针的c函数。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

你需要显示你如何知道它泄漏,你可能会看到CRT预先分配。 – Puppy 2010-11-27 13:02:37

+0

你是什么意思,“它似乎并没有完全释放内存”? – 2010-11-28 12:34:05

回答

2

free()所做的并不是完全释放指针所占用的内存,但实际上,如果在调用free()后调用malloc,它实际上可供以后使用。

一个证据是,你将能够在空闲调用并将指针设置为NULL之前访问内存位置(假设你还没有调用malloc())。当然,这些值将重置为某些默认值。 (在我发现int的一些编译器被设置为0)。

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

让我们知道:)

3

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

我认为,随着:

它似乎没有完全释放内存

你的意思是object仍持有旧值。


deleteMarnix,当你设置objectPointerNULL,你只设置在功能范围指针的值。

它不会在外部函数中设置实际指针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); 
    
+0

它应该仍然被释放()并且不会泄漏。 – Puppy 2010-11-27 13:02:18