C++智能指针使用报错,调试无果寻求问题原因
问题分析与修复方案
你的代码存在两个核心问题,直接导致了运行异常:
1. 未初始化的智能指针
你声明了std::unique_ptr<std::queue<int>> s;,但这个智能指针并没有指向任何实际的std::queue<int>对象——它默认是空指针(等价于nullptr)。当你尝试调用s->push()或者访问s->size()时,本质是在对空指针进行解引用,这会触发未定义行为(通常表现为程序崩溃)。
解决方法很简单,初始化智能指针让它指向一个真正的队列实例:
// 使用std::make_unique创建并初始化队列对象 std::unique_ptr<std::queue<int>> s = std::make_unique<std::queue<int>>();
或者,如果你其实不需要智能指针(这个场景完全没必要用),直接创建栈上的队列对象更简单高效:
std::queue<int> s;
2. 循环逻辑错误
你的for (int i = 0; i < s->size(); i++)循环存在逻辑问题:你没有从队列中弹出元素,所以队列的size()始终是2,而且每次访问front()和back()都会得到同一个值(14和2)。如果想遍历队列中的所有元素,应该用队列的empty()作为循环条件,每次处理完front()后调用pop()移除它。
修正后的完整代码(智能指针版本)
#include <iostream> #include <queue> #include <memory> // 别忘了包含std::make_unique需要的头文件 #include <Windows.h> int main() { // 初始化智能指针,指向新的队列实例 std::unique_ptr<std::queue<int>> s = std::make_unique<std::queue<int>>(); s->push(14); s->push(2); // 用empty()判断循环,处理元素后弹出队首 while (!s->empty()) { std::cout << "队首元素: " << s->front() << std::endl; std::cout << "队尾元素: " << s->back() << std::endl; s->pop(); // 移除已处理的队首元素 } Sleep(1500); return 0; }
更简洁的非智能指针版本(推荐)
因为这个场景没有动态分配内存的需求,直接用栈上对象更易读也更高效:
#include <iostream> #include <queue> #include <Windows.h> int main() { std::queue<int> s; s.push(14); s.push(2); while (!s.empty()) { std::cout << "队首元素: " << s.front() << std::endl; std::cout << "队尾元素: " << s.back() << std::endl; s.pop(); } Sleep(1500); return 0; }
总结一下:智能指针的核心作用是管理动态分配的内存,当你不需要动态分配时,直接使用栈上对象就好;如果一定要用智能指针,必须确保它指向一个已初始化的对象,避免空指针解引用。
内容的提问来源于stack exchange,提问作者Croampa Daniel Nestiutorul
相关产品推荐
相关产品推荐

