很棒的网站.. 我在我的程序中有这个错误,它发生在我free()我sturct指针类型.. 似乎不明白为什么..但我认为它与指针全局声明的事实有关。 谢谢你的帮助!
*请注意“prev”,“current”和“head”是全局的,并使用malloc()在另一个函数中分配;
代码:
void approve_delete(int* delete_request){
if(*delete_request == 0){
cout<<" there are no more delet requests\n";
return;
}
char choice[5];
char ch;
current = head;
Prev = head;
while (current->user.id != MAX_ID ){
if(current->user.want_delete == true){
cout<<"name : "<<current->user.name<<" "<<current->user.last_name<<" id: "<<current->user.id<<endl;
ch=0;
while( ch != 'y' && ch != 'Y' && ch != 'n' && ch != 'N') {
cout<<"approve delete? Y/N or (Q)exit\n";
cin.width(5);
cin>>choice;
ch=choice[0];
switch (ch) {
case 'y':
case 'Y':
item* Temp = current;
Prev->next = Prev-> next->next;
current=Prev->next;
free(Temp); //here the error occur!
cout<<"in";
*delete_request -= 1;
cout<<"student deleted\n";
break;
case 'n':
case 'N':
break;
case 'q':
case 'Q':
return;
}
}
}
Prev = current;
current = current->next;
}
}
答案 0 :(得分:1)
让我们看一下代码行并进行调试。
1. item* Temp = current;
2. Prev->next = Prev-> next->next;
3. current=Prev->next;
4. free(Temp);
第一行是将Temp
指针定义为item
(我们不知道)并将其初始化为指向当前item
。当然有效。
第二行是将next
点item
的字段Prev
指定为第三个item
。但是,第二个item
会发生什么?它去了哪里?这就是内存泄漏。
第三行指定current
指向上面描述的第三个item
。仍然不知道第二个item
去了哪里......
最后第四行释放Temp
。当然,没有错,但我仍然对第二个item
去了哪里感到困惑?
你在该代码片段的第2行有一个内存泄漏,因为你这样做是因为没有任何东西指向item
,因此你永远无法释放为item
分配的内存块
答案 1 :(得分:0)
在免费之前的某个时刻,你写信给不属于你的记忆。 也许您访问了使用malloc分配的数组的越界索引。 也许你访问了你已经释放的内存。 无论原因是什么,这些问题都很难调试。
由于您使用的是Windows,pageheap tool可能会有所帮助,但我没有使用它,所以我无法帮助您。
此外,如果您尝试删除第一项,雅各布对您的代码被破坏是对的。
答案 2 :(得分:0)
错误来自代码的不同部分。看完整个代码后(我私下与他交谈),问题是由于类型不匹配引起的。
'item'是一个具有两个布尔成员的结构(最后一个成员的类型为bool)。用数据填充结构的函数是使用文件中的数据。为了从文件中读取,他使用了fscanf(),并通过使用“%d%d”读取数值来获取布尔成员的数据。整数比布尔占用更多内存,因此堆已损坏。
答案 3 :(得分:-1)
最有可能的是,你'当前'节点为空,尝试取消引用空指针会导致内存异常。
PS:在操作动态创建的对象之前,始终执行'null'检查,
之类的东西 if(temp!=null){
free(temp);
}
希望这有帮助。
谢谢, 湿婆Shankar