C ++:指向释放的内存空间的指针

时间:2013-01-14 22:01:35

标签: c++ pointers memory memory-management

当我调用tail = head; tail->next= NULL;函数时,底部extractMin()的两行代码会导致程序崩溃。如果我发表评论,一切都按照假设发生。这是否正在发生,因为它们指向已释放的内存中的地址?

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

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++;
    }

1 个答案:

答案 0 :(得分:3)

您的else条款已损坏。如果prev为null,那么您尝试在第一个元素之前插入。

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

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