HEAP CORRUPTION DETECTED:正常阻塞后(#143)

时间:2013-08-09 08:07:13

标签: c++ visual-c++

很棒的网站.. 我在我的程序中有这个错误,它发生在我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;
    }
}

4 个答案:

答案 0 :(得分:1)

让我们看一下代码行并进行调试。

1. item* Temp = current;
2. Prev->next = Prev-> next->next;
3. current=Prev->next;
4. free(Temp);

第一行是将Temp指针定义为item(我们不知道)并将其初始化为指向当前item。当然有效。

第二行是将nextitem的字段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)

最有可能的是,你'当前'节点为空,尝试取消引用空指针会导致内存异常。

  1. 尝试打印节点中的值,从中可以推断出当前对象不为空,在这种情况下,没有理由让free(节点)无法工作。
  2. PS:在操作动态创建的对象之前,始终执行'null'检查,

    之类的东西
                 if(temp!=null){
                  free(temp);
                   }
    

    希望这有帮助。

    谢谢, 湿婆Shankar