新闻详情

新闻详情

首页 / 资讯中心 / 详情

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

发布时间:2026/9/28 5:02:43来源:尧图网络
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");
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

30岁退休?字节安全工程师说透网络安全就业前景与学习路线 2026/9/28 6:00:03

30岁退休?字节安全工程师说透网络安全就业前景与学习路线

1. 先回答那个最扎眼的问题:30岁"退休"到底是什么意思先说清楚,我标题里那个"30岁即将退休"不是真的去领养老金,而是从字节跳动这种大厂的高强度节奏里退下来。做网络安全这行的都懂,"退休"这个词在…

阅读更多 →
Cassandra实战:大数据高并发写入与分布式架构选型解析 2026/9/28 5:59:57

Cassandra实战:大数据高并发写入与分布式架构选型解析

1. 开篇:先说说我为什么还在用Cassandra这几年一聊到数据库选型,很多人第一反应就是MySQL或者PostgreSQL,NoSQL都快变成“历史词汇”了。但我手里有一套跑了快六年的Cassandra集群,每天写入量稳定在十亿条级别,数据量撑…

阅读更多 →
Flutter开发OpenHarmony应用:家人详情页全链路实现 2026/9/28 5:59:56

Flutter开发OpenHarmony应用:家人详情页全链路实现

从Flutter跨端开发转向OpenHarmony生态,最让人头疼的不是语言差异,而是整个工具链、平台通道和组件行为都得重新适应。最近我正好完成了一个家庭相册App的实战项目,核心模块之一是“家人详情”页面的实现,一路踩了不少坑&#xff…

阅读更多 →
Git分支管理实战:从指针本质到事故救援的完整指南 2026/9/28 5:59:56

Git分支管理实战:从指针本质到事故救援的完整指南

每次接手一个新项目,最让我头疼的往往不是代码本身,而是团队里那堆剪不断理还乱的分支。Git作为目前最主流的版本控制工具,分支管理既是它的核心优势,也是新手甚至老手最容易翻车的地方。我见过有人把功能分支全堆在master上&…

阅读更多 →
Hadoop分布式存储系统真运转:从伪分布到集群的架构认知与源码验证 2026/9/28 5:59:56

Hadoop分布式存储系统真运转:从伪分布到集群的架构认知与源码验证

简介:本资源是一套基于Hadoop构建的完整分布式存储系统实现,面向计算机类专业本科生、毕设与课程设计学习者及分布式技术初学者,解决从环境搭建、核心模块开发到Web交互管理的全流程实践问题。压缩包含203个文件,总计94.33MB&…

阅读更多 →
Java Web学生管理系统:JSP+Servlet+MySQL实战指南 2026/9/28 5:59:55

Java Web学生管理系统:JSP+Servlet+MySQL实战指南

简介:这是一套基于JavaJSPMySQL开发的Web版学生信息管理系统完整工程,面向计算机专业本科生及初学者,适用于课程设计、期末大作业与Java Web入门实践。系统涵盖学生信息的增删改查、登录认证、数据统计等核心功能,代码结构清晰、注…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉