【问题标题】:c memory leak problemc 内存泄漏问题
【发布时间】:2011-05-16 13:25:43
【问题描述】:

我的项目中有一个 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
}

最后一段代码 sn-p 显示了我如何制作、使用它并尝试删除它,但是,它似乎并没有完全释放内存。我做错了什么?

Object *object = createObject(21.0f, 1.87f);
//do things here with object.
deleteMarnix(object);

【问题讨论】:

  • 您需要表明您如何知道它正在泄漏,您可能只是看到 CRT 的预分配。
  • “似乎没有完全释放内存”是什么意思?

标签: c memory-management struct malloc free


【解决方案1】:

从您发布的 sn-ps 来看,没有泄漏。

我认为:

好像没有完全释放内存

您的意思是 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 );
    

【讨论】:

  • 它仍然应该被释放()而不是泄漏。
  • 正确。它只是您最后一个范围内的指针副本,它仍然作为“悬空指针”,但不会发生内存泄漏。我还建议将deleteMarnix 声明为接收Object **
  • 当然,但它正在变得免费。我认为“似乎它并没有完全释放内存”,OP 的意思是 object 仍然保持旧值。
【解决方案2】:

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

这方面的一个证据是,您将能够在调用 free 之后并将指针设置为 NULL 之前访问内存位置(假设您尚未调用 malloc() )。当然,这些值将被重置为一些默认值。 (在一些编译器上我发现 int 被设置为 0 )。

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

让我们知道:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 2010-12-15
    • 2011-07-29
    • 1970-01-01
    • 2016-07-28
    相关资源
    最近更新 更多