C++自定义队列pop函数疑问:delete删除指针还是实际Node节点?
关于队列pop()中delete操作的疑问解答
嘿,别担心,你的delete temp;操作是完全正确的——它确实删除了temp指向的那个Node实例,而不是仅仅删掉指针本身。我来给你拆解清楚:
指针和动态分配对象的区别
当你用new Node(data)创建节点时,操作系统会在堆内存中开辟一块空间来存储这个Node对象,然后返回一个指向这块空间的指针(也就是n或者temp这类变量)。指针本身只是一个存储地址的小变量,它存放在栈内存里(因为是函数局部变量)。
- 当你写
delete temp;时,你告诉操作系统:“把temp指向的那块堆内存释放掉,销毁对应的Node对象”。 - 而
temp这个指针变量本身,会在pop()函数执行完毕后,随着栈帧销毁自动消失,不需要你手动处理。
所以你的pop逻辑在删除节点这部分是没问题的,放心用~
给你提几个新手友好的改进建议
不过作为C++新手,你的代码还有几个可以完善的地方,避免后续踩坑:
处理空队列的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; }完善双向链表的指针关联
你的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; } }添加析构函数避免内存泄漏
当前你的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
相关产品推荐
相关产品推荐

