当我试图释放时检测到HEAP CORRUPTION(void * key)

时间:2013-01-19 09:51:28

标签: c malloc free

在程序结束时释放内存有问题。 这是来自学校的练习,使用ADT实现二叉树以及使用数据类型char进行特定实现。

释放代码:

void free_tree(TreeNode *root){
TreeNode *cur;
if (!root) return;
else{
cur = root;
free_tree(cur->left);
free_tree(cur->right);
free(cur->key);               //throws an error!
free(cur);
} }

这是关键本身的i malloc(问题可能在这里):

puts("Please enter a value for key of new node");
_flushall();
scanf("%s",&buffer);
user_input = (char *) malloc(sizeof(char)*(strlen(buffer)+1));
strcpy(user_input,buffer);
user_input[strlen(buffer)+1] = '\0';
p_node = create_tree_node(user_input);   //this function append the new data to a new node, returns *TreeNode
insert_node_by_value(&root,p_node,str_comp);
break;

这是我得到的错误:

Error Message

BTW释放节点本身工作正常!

我感谢您的帮助以及有关代码功能的任何提示和评论。

可以在此处找到functions.c的完整代码粘贴: http://pastebin.com/TqaNK5v8 - 函数

4 个答案:

答案 0 :(得分:1)

我能找到的唯一实际问题是:

 user_input[strlen(buffer)+1] = '\0';

由于user_input具有'strlen(buffer)+ 1'元素,因此它只能从0转换为strlen(缓冲区)。要解决这个问题非常简单,删除行,strcpy行为就是复制源字符串的\ 0。

答案 1 :(得分:1)

超过100的99个分支是cur->键未分配 free'd 不止一次。

另外

user_input[strlen(buffer)+1] = '\0';

应该是

user_input[strlen(buffer)] = '\0';
必须在scanf之前分配

和缓冲区以保存使用scanf检索的输入数据。

无法更多地了解您粘贴的代码

希望这有帮助

答案 2 :(得分:0)

数组索引从0开始。因此,如果要分配n个字节,访问第n个字节的正确方法是::

SomeArray[n-1] ;

答案 3 :(得分:0)

你将错误的诊断投射到其他人身上。请提供最小的可编译测试用例供我们调试。最小意味着“在没有任何不必要或不相关的代码的情况下显示问题的症状”。可编译意味着“能够在我们的机器上编译而不会修复错误或填补空白”。

在C中,您不需要转换malloc的返回值。停止使用C ++编译器来编译C代码。你知道scanf会失败吗?我怀疑这就是你在scanf之前错误地冲洗的原因。尝试正确处理scanf故障,而不是假设非便携式黑客会为你做这件事。您是否知道strcpy将为您终止目标字符串?

你正在读哪些书?