我有一个正在处理的简单双向链表示例,但由于某种原因,我不断收到错误消息:pointer being freed was not allocated
when I try to delete
这是在列表末尾插入方法的代码片段
template <class T>
void List<T>::insertAtEnd(T *o)
{
node *newNode = new node;
newNode->o = o;
newNode->next = NULL;
newNode->prev = last;
if(last != NULL)
last->next = newNode;
last = newNode;
if(first == NULL)
first = newNode;
delete(newNode); // This delete call will usually be in another method
} // It is just here right now for testing
这个类有两个实例字段,一个指向列表开头的指针和一个指向结尾的指针,分别是第一个和最后一个。每个节点都是一个结构如下:
struct node {
node *next;
node *prev;
T *o;
};
到目前为止,我只测试了插入 1 个节点,但我总是遇到同样的错误。但是,如果我注释掉这些行
if(first == NULL)
first = newNode;
它有效。请帮助?谢谢
编辑:第一个和最后一个都以 NULL
开头。
最佳答案
很遗憾,您没有提供完整的代码。您省略了包含错误的部分,因此我必须推测确切原因。
您看到的错误表明正在调用 delete
的地址不是通过 new
生成的。这可能意味着您无意中进行了值赋值,而不是指针赋值,然后试图释放复制的(堆栈分配的)变量。发生这种情况的一种具体方式是,如果您尝试删除 mynode->o
,因为 o
可能是堆栈变量的地址。
仔细检查应该是 node*
的每个类型都是 node*
,而不是 node
或 node **
。使用 -Wall -Wextra
编译您的代码可能会产生有用的额外警告,如果不是一般做法,应该是第一个调试步骤。
如果您的类型和赋值都是正确的,则您可能使用的 C++ 库或编译器不会给您特定的双重释放消息;这将扩大您看到的错误范围,包括两次释放相同的内存。尝试在释放地址之前打印一个地址(或使用调试器达到相同的效果)。当您看到同一个地址出现两次时,就是这样。
这可能是显而易见的,但您不能在那里调用 delete
并让您的函数正常工作。 first
和last
将指向释放的内存。觉得有必要说一下,以防万一。
关于c++ - 无法在C++中删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9058241/