【发布时间】: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