指向已释放内存空间的指针

C++: Pointers pointing to freed memory space

本文关键字:空间 指针 内存 释放      更新时间:2023-10-16

当我调用extractMin()函数时,底部tail = head; tail->next= NULL;的两行代码导致程序崩溃。如果我把它们注释掉,一切都按预期进行。这是因为它们指向内存中已释放的地址吗?

编译器给我的唯一线索是:EXC_BAD_ACCESS (code=2, address=0x0)。我立刻注意到地址是0所以这里有问题,但究竟是什么?

string LinkedListPQueue::extractMin() {
    if (isEmpty())
        error("Tried to dequeue from epmpty queue!");
    cell *toBeDeleted = head;   //pointer to this head
    string value = head->value; //get value of this head
    head = head->next;          //move so this head is not the same as the one to be deleted
    delete toBeDeleted;         //delete previous head.
    return value;
}

/* Implementation notes: enqueue
 * -----------------------------
 * We have to search to find the proper position, which can be a bit tricky with
 * a singly-linked list.  We walk two parallel pointers, one a step behind the other,
 * until we find the correct position to insert the new cell, which we then splice
 * into place. Note the special case of inserting at the head. Alternatively, this
 * operation could work recursively.
 */
void LinkedListPQueue::enqueue(const string& elem) {
    cell *cur, *prev, *newOne = new cell;
    newOne->value = elem;

    for (prev = NULL, cur = head; cur != NULL; prev=cur, cur = cur->next) {
        if (elem > cur->value) break;
    }
    newOne->next = cur;
    if (prev) {
        prev->next = newOne;
        logSize++; 
    } else {
        head = newOne;
        tail = head;
        tail->next= NULL;
        logSize++;
    }

您的else条款已失效。如果prev是空的,那么你尝试在第一个元素之前插入。

else {
  cell *oldHead = head;
  head = newOne;
  head->next = oldHead;
  logSize++;
}

设置tail->next = NULL是核心错误