在C计划中查找堆腐败

时间:2015-04-23 03:24:13

标签: c debugging memory-management heap-corruption

我环顾四周,但这里的大部分答案都是针对代码中明显存在堆损坏的问题,或者提问者已经确定来源的问题。

我有一个C程序(模拟汽车竞赛),它为链表动态分配内存。然后,它根据节点中的值将列表中的一个或多个节点的值复制到动态分配的2D阵列中。复制后,每个节点都会被释放,并更新列表头。重复此过程直到列表中没有更多节点(比赛结束)。

指向数组的指针返回main并存储在3D数组中。

然后重复整个过程(新的链表,新数组)。

在第二次迭代(第二次竞赛)结束时,我收到了一个堆损坏错误,我无法弄清楚导致它的原因。

我尝试按照此处的建议使用VLD:Memory allocation / Heap corruption in std::string constructor

但是包含VLD后我没有收到错误。

我也尝试启用调试堆函数:https://msdn.microsoft.com/en-us/library/x98tx3cf.aspx

这告诉我地址​​是0x596EBC5C,它似乎不包含我分配的任何内容,因此我不确定这是否有意义。

我能说的最好,我在这段代码中收到了错误,但我甚至都不确定,而且我也不知道这会如何帮助我找到问题的根源。

void MoveFinishers(NODE **racehead, int **FinisherList, int raceLength) {
    static int numberOfFinishers = 0;
    NODE *head = *racehead;
    NODE *temp = *racehead;
    NODE *tempNext = NULL;
    while (head != NULL && head->car.distance >= raceLength)
    {
        FinisherList[0][numberOfFinishers] = head->car.number;
        numberOfFinishers++;
        head = head->next; //advance to the next finisher
    }

    *racehead = head; //change the list head to start with the first non-finisher

    //free all list elements before the first non-finisher
    while (temp != head)
    {
        tempNext = temp->next; //iterates through the temp values
        free(temp);
        temp = tempNext;
    } //end while
}

1 个答案:

答案 0 :(得分:3)

我终于明白了。不幸的是,我仍然无法通过调试器找到问题,而只是查看代码。

无论如何,问题在于:

static int numberOfFinishers = 0

我宣布它是静态的,因为我需要它来维持一场比赛中的状态。

然而,在第一场比赛之后,我没有重置计数器,所以这实际上是开始在未分配的内存中存储值:

FinisherList[0][numberOfFinishers]

修复就像在函数末尾添加它一样简单:

    if (!head)
    {
        numberOfFinishers = 0;
    }