-1

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

4 回答 4

1

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

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

第一行定义了一个指向 a 的指针Tempitem我们不知道)并将其初始化为指向当前的item. 当然这行得通。

第二行将那个点的字段分配为第三next个。但是,第二个会发生什么?它去哪儿了?这是这里的内存泄漏。itemPrevitemitem

第三行指定current指向第三行item,如上所述。还是不知道第二个item去哪儿了……

最后第四行释放Temp。当然,这没有错,但我仍然对第二个item去向感到困惑?

您在该片段的第 2 行有内存泄漏,因为您正在制作它,因此没有任何东西指向 a item,因此您将永远无法释放为该分配的内存块item

于 2013-08-09T08:19:12.477 回答
0

在自由之前的某个时刻,你写给了不属于你的记忆。也许您访问了使用 malloc 分配的数组的越界索引。也许你访问了你已经释放的内存。不管是什么原因,这些问题都很难调试。

由于您使用的是 Windows,因此pageheap 工具可能会有所帮助,但我没有使用它,因此无法为您提供帮助。

此外,如果您尝试删除第一项,Jacob 关于您的代码被破坏的说法是正确的。

于 2013-08-09T11:19:29.503 回答
0

错误来自代码的不同部分。看了整个代码后(我私下跟他谈过),问题是类型不匹配引起的。

'item' 是一个结构,它有两个布尔成员(最后一个成员是 bool 类型)。用数据填充结构的函数正在使用文件中的数据。为了从文件中读取,他使用 fscanf(),并通过使用“%d%d”读取数值来获取布尔成员的数据。整数比布尔值占用更多的内存,所以堆被破坏了。

于 2013-08-09T17:42:07.450 回答
-1

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

  1. 尝试打印节点中的值,您可以从中推断出当前对象不为空,在这种情况下,free(node) 没有理由不工作。

PS:在您对动态创建的对象进行操作之前,请始终进行“空”检查,例如

             if(temp!=null){
              free(temp);
               }

希望这可以帮助。

谢谢,湿婆香卡

于 2013-08-09T08:18:55.480 回答