ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

C++智能指针全解析:面试必考的10个问题,90%的候选人答不全!

C++智能指针全解析:面试必考的10个问题,90%的候选人答不全! C++智能指针全解析:面试必考的10个问题,90%的候选人答不全!本文属于「C++面试必考」系列,从底层原理到实战应用,一篇搞定智能指针所有考点。前言在C++面试中,如果要评选"出现频率最高的知识点",智能指针绝对稳居前三。无论是校招还是社招,无论是大厂还是创业公司,面试官总能在智能指针上问出花来。但很多同学对智能指针的理解还停留在"shared_ptr是引用计数、unique_ptr是独占所有权"这个层面。今天这篇文章,我们就来一次彻底的全解析,从底层实现到面试高频问题,让你在这一块再无死角。一、为什么需要智能指针?在C++中,内存管理一直是最大的痛点之一。裸指针(raw pointer)带来了一个经典问题:voidprocess(){Resource*res=newResource();// ... 使用resif(some_condition){return;// 忘记delete,内存泄漏!}deleteres;}这段代码有一个经典的bug:当some_condition为true时,函数提前返回,res指向的内存永远不会被释放。更糟糕的情况是异常安全:voidprocess(){Resource*res=newResource();// ... 使用resmay_throw_exception();// 如果这里抛异常,下面的delete永远不会执行deleteres;}RAII(Resource Acquisition Is Initialization)思想应运而生:用对象的生命周期来管理资源。智能指针就是RAII最经典的应用。voidprocess(){std::unique_ptrResourceres(newResource());// 无论函数怎么退出(return/异常),res都会被正确释放}二、三种智能指针详解2.1 unique_ptr:独占所有权的智能指针unique_ptr是最轻量级的智能指针,它独占所管理的对象,不允许拷贝,只允许移动:#includememory#includeiostream#includestringclassWidget{public:Widget(std::string name):name_(std::move(name)){std::cout"Widget "name_" created\n";}~Widget(){std::cout"Widget "name_" destroyed\n";}voidshow()const{std::cout"I am "name_"\n";}private:std::string name_;};intmain(){// 创建方式1:直接newstd::unique_ptrWidgetp1(newWidget("Alpha"));// 创建方式2:make_unique(C++14推荐)autop2=std::make_uniqueWidget("Beta");// p1不能拷贝!下面这行会编译错误// auto p3 = p1; // ERROR: use of deleted copy constructor// 但可以移动所有权autop3=std::move(p1);// p1变为nullptr,所有权转移给p3p3-show();// 输出: I am Alpha// p1已经为空if(!p1){std::cout"p1 is nullptr\n";}}// 输出:// Widget Alpha created// Widget Beta created// I am Alpha// p1 is nullptr// Widget Alpha destroyed// Widget Beta destroyedunique_ptr的底层实现几乎是零开销的——它的大小就是一个裸指针的大小(8字节),析构时自动delete。// 验证unique_ptr的大小static_assert(sizeof(std::unique_ptrint)==sizeof(int*),"unique_ptr should be same size as raw pointer");
返回列表