You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++自定义队列pop函数疑问:delete删除指针还是实际Node节点?

关于队列pop()中delete操作的疑问解答

嘿,别担心,你的delete temp;操作是完全正确的——它确实删除了temp指向的那个Node实例,而不是仅仅删掉指针本身。我来给你拆解清楚:

指针和动态分配对象的区别

当你用new Node(data)创建节点时,操作系统会在堆内存中开辟一块空间来存储这个Node对象,然后返回一个指向这块空间的指针(也就是n或者temp这类变量)。指针本身只是一个存储地址的小变量,它存放在栈内存里(因为是函数局部变量)。

  • 当你写delete temp;时,你告诉操作系统:“把temp指向的那块堆内存释放掉,销毁对应的Node对象”。
  • 而temp这个指针变量本身,会在pop()函数执行完毕后,随着栈帧销毁自动消失,不需要你手动处理。

所以你的pop逻辑在删除节点这部分是没问题的,放心用~

给你提几个新手友好的改进建议

不过作为C++新手,你的代码还有几个可以完善的地方,避免后续踩坑:

  1. 处理空队列的pop操作
    现在如果队列已经空了,调用pop()会直接访问front->data,这会触发未定义行为(程序崩溃)。可以加个判断,比如:

    T pop(){
        if (front == nullptr) {
            // 这里可以抛异常,或者返回T的默认值,根据需求来
            throw std::runtime_error("Queue is empty!");
        }
        Node* temp = front;
        T element = temp->data;
        front = front->next;
        // 如果front变成nullptr,说明队列空了,back也要置空
        if (front == nullptr) {
            back = nullptr;
        }
        delete temp;
        return element;
    }
    
  2. 完善双向链表的指针关联
    你的Node结构体定义了previous指针,但push_back里只设置了back->next = n,没有把n->previous指向旧的back,这样双向链表的结构是不完整的。修改一下push_back:

    void push_back(T data){
        Node* n = new Node(data);
        if(front == nullptr){
            front = n;
            back = n;
        } else {
            back->next = n;
            n->previous = back; // 加上这一行
            back = n;
        }
    }
    
  3. 添加析构函数避免内存泄漏
    当前你的Queue类没有析构函数,当Queue对象被销毁时,堆上的所有Node都不会被释放,会造成内存泄漏。添加一个析构函数:

    ~Queue(){
        Node* current = front;
        while(current != nullptr){
            Node* next = current->next;
            delete current;
            current = next;
        }
        front = nullptr;
        back = nullptr;
    }
    

测试代码的小问题

你的print()函数里的std::cout << cursor->data << ' ';应该改成std::cout << cursor->data << '\n';或者std::endl;,不然字符' '是非法的,编译会报错。

内容的提问来源于stack exchange,提问作者Dan Savage

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 09:57:40