以下C代码中的内存泄漏

时间:2011-09-11 17:31:00

标签: c memory-management memory-leaks valgrind

如何释放从代码中泄漏的内存。

struct object_one{
  int value;
}*object,object_node;

struct node_one {
  void **pointers;

}*node, node_node;

  node sample(){
  object number;
  node node123;
  node123 = malloc(sizeof(node_node));
  number = malloc(sizeof(object_node));
  number->valu = malloc(sizeof(int));
  number->value = 9;
  node123->pointers[0]=number; 
  free(number);
  return node123; 
}

我是否采用正确的方法来释放number引用的内存。一旦我执行上述操作,我就会收到错误;

Invalid read of size 4
==15957==    at 0x403804: main (abc.c:1255)
==15957==  Address 0x540cb50 is 0 bytes inside a block of size 4 free'd

请建议我如何在这种情况下防止内存泄漏?提前谢谢。

[编辑]

实际上,上面提到的并不是我的真实代码。但我已经尽力重新选择代码的sturcutre和语义。实际上我正在实施数据架构。 number是一些临时存储空间,node123是我真实的数据库。我想在数据库中分配number的值并取消引用它。number类型是数据库的一个组件。

[EDIT2]

与行1255对应的代码正在打印object i'e value所拥有的值。它看起来像:

   object tempObject;
   tempObject = search_object(root,50);
   [1255] printf("Key is %d ------>value is %d\n",50,tempObject->value);

此处函数search_object搜索与键50对应的值。该函数返回与键关联的正确值,但仍显示此错误。

3 个答案:

答案 0 :(得分:5)

您还需要free(node123)

但这不是错误消息告诉您的内容。

你也取消引用一个没有指向有效内存的指针(在行node123->pointers[0] = number)上。)你没有为pointers分配任何内存指向,所以解除引用就像这样写到记忆中的随机区域。

答案 1 :(得分:2)

你好像忘了释放(node123)。

对于每个malloc()调用,您必须有一个free()调用。

您显示的valgrind错误不是内存泄漏,它是已被释放的内存区域中的无效读取。

它发生在abc.c的第1255行。

答案 2 :(得分:1)

你忘了一个免费的(node123);

还有这一行:node123-> pointers [0] = number;是一个麻烦。

你没有在node123中初始化指针。