c++ - 无法在C++中删除

标签 c++

我有一个正在处理的简单双向链表示例,但由于某种原因,我不断收到错误消息: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*,而不是 nodenode **。使用 -Wall -Wextra 编译您的代码可能会产生有用的额外警告,如果不是一般做法,应该是第一个调试步骤。

如果您的类型和赋值都是正确的,则您可能使用的 C++ 库或编译器不会给您特定的双重释放消息;这将扩大您看到的错误范围,包括两次释放相同的内存。尝试在释放地址之前打印一个地址(或使用调试器达到相同的效果)。当您看到同一个地址出现两次时,就是这样。

这可能是显而易见的,但您不能在那里调用 delete 并让您的函数正常工作。 firstlast 将指向释放的内存。觉得有必要说一下,以防万一。

关于c++ - 无法在C++中删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9058241/

相关文章:

c++ - 支持正斜杠和句号的正则表达式

c++ - 数组遍历与指针,缓存效率方面

c++ - 如何否定 std::is_integral 用于标签分派(dispatch)?

c++ - 将 Boost.Coroutine 与 Boost.ASIO 一起使用会导致断言

c++ - 迭代器和指针有什么区别

c++ 对象参数 : polymorphism, 值语义,对象生命周期?

c++ - 带 boost 的平行部分

c++ - 特殊类模板的类外构造函数定义

c++ - 如何删除 Bitblt 的输出? (MFC)

c++ - OpenGL - 与 future 的上下文共享现有纹理?