C++面试必考——智能指针全解析 📅 发布时间:2026/9/12 20:47:03 👁 浏览次数: C++面试必考——智能指针全解析面试官:说说C++的智能指针。你:unique_ptr、shared_ptr、weak_ptr。面试官:然后呢?你:……前言C++面试中,智能指针是必考题。几乎每场C++面试都会问到。但大多数人的回答停留在"三种智能指针"的表面,一旦面试官深入追问,就露馅了。这篇把智能指针从原理到实现到面试陷阱全部讲透。看完这篇,智能指针这块你可以横着走。一、为什么需要智能指针?1.1 裸指针的问题voidfoo(){int*p=newint(42);if(something)return;// 内存泄漏!deletep;}裸指针的三大罪状:忘记delete→ 内存泄漏重复delete→ 未定义行为delete后使用→ 悬空指针1.2 RAII思想智能指针的核心思想是RAII(Resource Acquisition Is Initialization):资源的生命周期绑定到对象的生命周期。对象创建时获取资源,对象销毁时释放资源。classSmartPtr{int*ptr;public:SmartPtr(int*p):ptr(p){}// 构造时获取~SmartPtr(){deleteptr;}// 析构时释放int*get(){returnptr;}};二、unique_ptr——独占所有权2.1 基本用法#includememorystd::unique_ptrintp1=std::make_uniqueint(42);// std::unique_ptrint p2 = p1; // 编译错误!不能拷贝std::unique_ptrintp3=std::move(p1);// 可以移动// 此时p1为空,p3拥有资源2.2 核心特性独占所有权:同一时刻只有一个unique_ptr拥有资源不可拷贝:拷贝构造函数和拷贝赋值运算符被删除可移动:通过std::move转移所有权零开销:大小和裸指针一样(通常8字节)2.3 常见用法// 作为函数返回值std::unique_ptrWidgetcreateWidget(){returnstd::make_uniqueWidget();}// 作为类成员classMyClass{std::unique_ptrImplimpl;// Pimpl模式public:MyClass():impl(std::make_uniqueImpl()){}};// 自定义删除器autodeleter=[](int*p){free(p);};std::unique_ptrint,decltype(deleter)p(