如何释放从代码中泄漏的内存。
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
对应的值。该函数返回与键关联的正确值,但仍显示此错误。
答案 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中初始化指针。