【问题标题】:Program crashes after using "delete" on temp pointer, even if new and delete lines are the only ones left?在临时指针上使用“删除”后程序崩溃,即使只剩下新行和删除行?
【发布时间】:2016-02-27 17:35:19
【问题描述】:

所以我正在创建一个双向链表类并使用临时节点来插入新值等等。所以我有一个节点结构:

template <typename T>
struct Node
{
    // Data in this node
    T mData;
    // Link to previous node
    Node* mPrev;
    // Link to next node
    Node* mNext;
};

我在实际的 List 类中有以下成员变量:

// Pointer to the head node
Node<T>* mHead;
// Pointer to the tail node
Node<T>* mTail;
// Pointer to current node
Node<T>* mCurr;
// Number of nodes currently in the list
unsigned mSize;

所有这些都是犹太教,是我的教授给我的。

但是,每当我创建一个临时指针来插入一个新值时,使用 delete 关键字会使程序崩溃,并出现错误“第一次机会异常在...访问冲突读取位置...”。这是我正在编写的函数的示例:

void insert_front(const T& value)
{
    Node<T>* temp = new Node<T>;

    temp->mData = value;
    temp->mPrev = nullptr;
    temp->mNext = mHead;

    if (mSize == 0)
    {
        mTail = temp;
        mHead = temp;
    }
    else
    {
        mHead->mPrev = temp;
        mHead = temp;
    }
    mSize++;
    //delete temp;
}

现在除了明显的内存泄漏之外,这个函数可以正常工作。但是当我在任何地方添加删除时,整个事情都会崩溃。即使我删除了除了新行和删除行之外的所有内容,一切都会崩溃。程序中唯一的其他文件是由我的教授创建的,没有错误。我做错了什么?

【问题讨论】:

  • 请在delete 中发布一个完整的示例。创建节点时,不应删除它们。只有在删除元素或列表销毁时才会删除它们。
  • 不要以为教授给出的代码是没有错误的。
  • @Neill Kirk 我承认教授可能会搞砸,但我的同学都没有报告这个问题,而且他们中的许多人已经提交了!
  • 谢谢Nandu 和vsoftco,你们的回答帮助我发现了问题,我不需要删除temp,只需要删除head/tail 等。我修复了内存泄漏和程序不再崩溃。谢谢你们!
  • @AlexxMurphy 你不是删除指针,而是删除对象。并且您不允许删除该对象,然后再访问它,即使您使用两个不同的指针来执行此操作。

标签: c++ pointers memory dynamic


【解决方案1】:

如果我打赌,我敢打赌,临时指针现在是您列表中不可或缺的一部分,而不是简单的占位符。

if (mSize == 0)
{
    mTail = temp;
    mHead = temp;
}
else
{
    mHead->mPrev = temp;
    mHead = temp;
}

当您删除 temp 时,您将删除 mTail 和 mHead 或 mHead->mPrev 和 mHead 指向的任何内容。当您尝试访问这些已删除的数据时,您会遇到未定义的行为,这通常是崩溃。

【讨论】:

    猜你喜欢
    • 2016-03-11
    • 1970-01-01
    • 2014-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多