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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:09:05