智能指针

2024/4/11 17:18:27

大厂面试重要C++知识(三)—— 智能指针

目录一、前言二、智能指针三、auto_ptrauto_ptr基本操作智能指针赋值四、unique_ptr五、share_ptr六、weak_ptr解决互相引用问题七、总结一、前言 C/C最让人诟病的特性之一:内存泄漏。因此如java、C#等语言都提供了内置内存分配与释放功能,屏蔽了指针。…

c++智能指针unique_ptr和weak_ptr

unique_ptr unique_ptr简介 一个unique_ptr “拥有”它所指向的对象。与shared_ptr不同,某个时刻只能有一个unique_ptr指向一个给定的对象。即两个 unique_ptr 不能指向一个对象,unique_ptr 之所以叫这个名字,是因为它只能指向一个对象&…

C++智能指针之weak_ptr(保姆级教学)

目录 C智能指针之weak_ptr 概述 作用 本文涉及的所有程序 使用说明 weak_ptr的常规操作 lock(); use_count(); expired(); reset(); shared_ptr & weak_ptr 尺寸 智能指针结构框架 常见使用问题 shared_ptr多次引用同一数据,会导致两次释放同一内…

智能指针—从auto_ptr说起

文章转载自&#xff1a;https://blog.csdn.net/k346k346/article/details/81478223 auto_ptr 是STL中智能指针家族的成员&#xff08;auto_ptr、unique_ptr_、share_ptr、week_ptr&#xff09;之一&#xff0c;由C98引入&#xff0c;定义在头文件<memory>。其功能和用法类…

Android系统原理性问题分析 - RefBase、sp、wp 分析

声明 在Android系统中经常会遇到一些系统原理性的问题&#xff0c;在此专栏中集中来讨论下。接触Android系统&#xff0c;遇到很多sp、wp相关问题&#xff0c;此篇分析Android系统内的智能指针问题。此篇参考一些博客和书籍&#xff0c;代码基于Android 9.0.0&#xff0c;不方…

【C/C++学习笔记】C++11 智能指针(TR1)

智能指针介绍 C11 提供了四种智能指针&#xff1a;auto_ptr、unique_ptr、shared_ptr 和 weak_ptr&#xff0c;定义在头文件 <memory> 中。其中auto_ptr 是 C98 提供的解决方案&#xff0c;C11 已将其摒弃&#xff0c;并提出了 unique_ptr 作为 auto_ptr 替代方案。虽然…

C++ 智能指针深度剖析

文章目录 1. 前言2. 为什么需要智能指针&#xff1f;3. 内存泄漏3.1 内存泄漏的概念及危害3.2 内存泄漏的分类3.3 如何检测内存泄漏3.4 如何避免内存泄漏 4. 智能指针的使用及原理4.1 RAII思想4.2 智能指针的原理4.3 C智能指针发展历史4.4 std::auto_ptr4.5 std::unique_ptr4.6…

Effective C++读书笔记----资源管理

C中&#xff0c;我们自己申请的资源&#xff0c;需要我们手动的释放。有时候我们给了显示释放资源的语句&#xff0c;但是存在有些意外情况导致释放语句没能成功被执行。比如说在执行释放语句前函数提前返回&#xff1b;假如释放语句在一个循环内部&#xff0c;循环因为continu…

C++新特性:智能指针

一 、为什么需要智能指针 智能指针主要解决以下问题&#xff1a; 1&#xff09;内存泄漏&#xff1a;内存手动释放&#xff0c;使用智能指针可以自动释放 2&#xff09;共享所有权指针的传播和释放&#xff0c;比如多线程使用同一个对象时析构问题&#xff0c;例如同样的数据…

C++中智能指针的设计和使用

转载请标明出处&#xff0c;原文地址&#xff1a;http://blog.csdn.net/hackbuteer1/article/details/7561235 智能指针(smart pointer)是存储指向动态分配&#xff08;堆&#xff09;对象指针的类&#xff0c;用于生存期控制&#xff0c;能够确保自动正确的销毁动态分配的…

【C++进阶之路】C++11(中)

一、可变参数模板 1.基本概念 想要了解C语言的可变参数列表的原理可见&#xff1a;可变参数列表 这个跟C语言的可变参数列表有一定的关系,常用的printf与scanf的参数就包含可变参数列表。 那么可变参数模板是什么呢&#xff1f;举个例子便一目了然。 template<class...Arg…

C++进阶:异常和智能指针

异常 传统错误处理机制是assert断言和errno错误码。两种方式都有很大的局限性&#xff1a; 错误处理机制局限性断言强制终止程序&#xff0c;用户难以接受错误码返回值传递错误码&#xff0c;占用函数返回位置&#xff1b;无法直接展示信息&#xff0c;需查错误码表 1. 异常…

C++智能指针(三)——unique_ptr初探

与共享指针shared_ptr用于共享对象的目的不同&#xff0c;unique_ptr是用于独享对象。 文章目录 1. unqiue_ptr的目的2. 使用 unique_ptr2.1 初始化 unique_ptr2.2 访问数据2.3 作为类的成员2.4 处理数组 3. 转移所有权3.1 简单语法3.2 函数间转移所有权3.2.1 转移至函数体内3.…

C++:基于RAII思想的智能指针

前言 C没有垃圾回收机制&#xff0c;new或者malloc的资源都需要我们手动进行释放。但有时也会发生忘记释放的问题&#xff0c;这就会造成内存泄漏或异常安全的问题。 C就引入了智能指针对上述问题进行解决。 一&#xff1a;RAII RAII 是一种利用对象生命周期来控制程序资源…

智能指针使用

最近在复习C的一些相关知识&#xff0c;正好把智能指针重新梳理一遍。 智能指针 作用 为什么需要智能指针&#xff1f;说白了就是为了更加“方便智能”的管理内存&#xff0c;当使用原始指针有时候会因为忘记释放内存&#xff0c;从而导致内存泄漏 。智能指针则可以帮我们释放…

C++【智能指针】

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析&#xff08;3&#xff09; 目录 &#x1f449;&#x1f3fb;为什么需要智能指针&#x…

C++11 shared_ptr类型智能指针学习

智能指针和普通指针的用法类似,但是智能指针可以在适当时机自动释放分配的内存。 C++11有三种类型的智能指针,shared_ptr、unique_ptr 以及 weak_ptr; 先学习shared_ptr类型; shared_ptr<T> 的定义位于<memory>头文件,并位于 std 命名空间中; T 表示指针指…

【C++11(三)】智能指针详解--RAII思想循环引用问题

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; C11 1. 前言2. 为什么要有智能指针?3. RAII思想…

boost::shared_ptr 智能指针在项目中的使用

0x01 智能指针的设计的目的 在linux c/c编程过程中&#xff0c;对资源的合理使用是一个常遇到的题&#xff0c;如何防止内存泄露是c/c程序员必须关注的问题。如何规避内存泄露&#xff0c;那就必须要有良好的编程习惯&#xff0c;malloc/free,new/delete需成对出现等。 C编程中…

boost::scoped_ptr

0x01 缘由 我想有些知识点存在即有它的意义&#xff0c;可能在不同的场景有不同的使用场景。有了boost::shared_ptr 为啥还要有一个boost::scoped_ptr呢&#xff1f;带着这个疑问学习了一下。 0x02 认识boost::scoped_ptr scoped 意为作用域&#xff0c;表示此智能指针只能在本…

Rust踩雷笔记(5)——刷点链表的题(涉及智能指针Box,持续更新)

目录 leetcode 2 两数相加——模式匹配单链表Box 只能说Rust链表题的画风和C完全不一样&#xff0c;作为新手一时间还不太适应&#xff0c;于是单独为链表、智能指针开一篇&#xff0c;主要记录leetcode相关题型的答案以及注意事项。 leetcode 2 两数相加——模式匹配单链表Bo…

c++11--强枚举类型,智能指针

1.枚举 1.1. c11之前的枚举 实例 #include <iostream>enum Type{ONE,TWO,THREE };int main(){printf("sizeof_%d, ONE_%d\n", sizeof(ONE), ONE);return 0; }具备以下特点&#xff1a; (1). 枚举值直接在父作用域可见。 (2). 枚举底层类型由编译器结合枚举成员…

还在因为指针的释放问题而烦恼吗?快来看下C++11智能指针shared_ptr

智能指针是这样一种类&#xff0c;即其对象的特征类似于指针。例如&#xff0c;智能指针可以存储new分配的内存地址&#xff0c;也可以被解除引用。 因为智能指针是一个类对象&#xff0c;因此它可以修改和扩充简单指针的行为。例如&#xff0c;智能指针可以建立引用技术&#…

批量创建链表节点(推荐智能指针)

一、手动创建链表节点 ListNode* l1 new ListNode(2); l1->next new ListNode(4); l1->next->next new ListNode(3);二、循环创建链表节点 采用 std::vector 来存储链表的数值&#xff0c;而后&#xff0c;循环遍历这些数值&#xff0c;并逐个创建节点&#xff0…

异常和智能指针

智能指针的认识 智能指针是一种C语言中用于管理动态内存的工具&#xff0c;它们可以自动管理内存的分配和释放&#xff0c;从而避免内存泄漏和悬空指针等问题。智能指针可以跟踪指向的对象的引用次数&#xff0c;并在需要时自动释放被引用的内存&#xff0c;这极大地提高了内存…

C++11中的智能指针

文章转载自&#xff1a;http://www.jellythink.com/archives/684 千呼万唤始出来 上一篇《从auto_ptr说起》中详细的总结了C98标准中的auto_ptr&#xff0c;但是随着C11的到来&#xff0c;auto_ptr已经不再了&#xff0c;即将成为历史&#xff1b;好的东西总是会受到大家的欢…

c++ 智能指针shared_ptr详解

参考资料&#xff1a;&#xff1a; Cprimer 为什么需要智能指针 在c中&#xff0c;动态内存的管理的管理是通过一对运算符来完成的&#xff1a;new在内存中为对象分配空间并返回一个指向该对象的指针&#xff0c;delete接受一个动态对象的指针&#xff0c;销毁该对象&#xf…

STL之auto_ptr

在c11里auto_ptr被声明为过时的。 智能指针在std_memory.h中实现&#xff0c;下面是它的源码&#xff08;稍有改动&#xff09;&#xff1a; template <class _Tp1> struct auto_ptr_ref {_Tp1* _M_ptr;auto_ptr_ref(_Tp1* __p) : _M_ptr(__p) {} };template <class…

C++智能指针之shared_ptr(保姆级教学)

目录 C智能指针之shared_ptr 本文涉及所有程序 工作原理 使用方法 手动初始化 std::make_shared函数&#xff08;C14提出&#xff09; 构造方法初始化 make_shared初始化 使用实例 shared_ptr常规操作 use_count(); unique(); reset(); get(); 指定删除器 移动…

C++基础学习之5 - 认识C11新特征

C11可以说是一个里程碑&#xff0c;针对C本身的诸多问题&#xff0c;提供了优秀的思路和解决方案&#xff0c;作者从其中的几个点来介绍下C11的几个典型特征。概括新特性包括&#xff1a;auto类型推断、右值引用、智能指针、lambda表达式&#xff0c;另外还有 类型初始化列表、…

C++拾遗--智能指针

C拾遗--智能指针 前言 内存泄露是常见的问题&#xff0c;新标准中的智能指针从根本上解决了这个问题。所谓的智能指针&#xff0c;其智能性体现在&#xff1a;当没有对象使用某块动态分配的内存时&#xff0c;那就自动释放这片内存。 智能指针 下面这段程序可耗尽内存&#…

Android14之智能指针的弱引用、强引用、弱指针、强指针用法区别及代码实例(二百零五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

【复习整理归纳】| C++面经(内存管理)

文章目录索引内存分配和管理1 malloc、calloc、realloc、alloca2 malloc、free3 new、delete4 定位 new5 如何定义一个只能在堆上&#xff08;栈上&#xff09;生成对象的类&#xff1f;6 智能指针7 强制类型转换运算符8 运行时类型信息 (RTTI)9 堆和栈的区别10 你觉得堆快一点…

c++智能指针(三)之shared_ptr和new结合使用

shared_ptr和new结合使用 我们除了使用make_shared来初始化一个智能指针&#xff0c;还可以使用new返回的指针来初始化智能指针。 shared_ptr<int> p1(new int(42));//p1指向一个值为42的int shared_ptr<int> p2 new int(1024);//错误&#xff0c;不能将一个内置…

c++之智能指针(二)之直接管理内存

直接管理内存 c定义了两个运算符来分配和释放动态内存。new分配内存&#xff0c;delete释放new分配的内存。 相对于智能指针&#xff0c;使用这个两个运算符非常容易出错。因为它不能依赖类对象拷贝、赋值和销毁操作的任何默认定义。 使用new动态分配和初始化对象 默认情况…

C++11 信号槽 signal/slot

最近在看陈硕大大 的《Linux 多线程服务端编程&#xff1a;使用 muduo C 网络库》 &#xff0c;看到里面用variadic template 和boost智能指针 实现了一个 signal/slot&#xff0c;现在C11 已经把 boost的智能指针引入到标准库里边了。就想利用纯C11 实现一遍。 结果发现&…

【C++】三种智能指针(auto_ptr,unique_ptr,shared_ptr)

c中的智能指针主要是基于RAII思想的。 不懂RAII思想的同学可以看看这篇博文-->RAII思想---利用对象生命周期来控制程序资源 智能指针的两大要素 RAII思想&#xff1a;把资源交给这个对象管理像指针一样的行为&#xff08;重载operator* 和operator->&#xff09;templa…

智能指针使用方法速查

智能指针使用方法简要总结&#xff0c;方便快速查询使用。 1.share_ptr &#xff08;1&#xff09;允许多个指针指向同一个对象。 &#xff08;2&#xff09;支持的操作 share_ptr sp;//定义空智能指针 p将p当做条件判断&#xff0c;若指向对象&#xff0c;则为真 *p 解引用获取…

由C++的泛型句柄类思考OpenCV的Ptr模板类

本文转自&#xff1a;http://www.cnblogs.com/liu-jun/archive/2013/03/24/2979648.html OpenCV&#xff08;计算机视觉库&#xff09;2.4.4版本已经发布了&#xff0c;OpenCV发展到现在&#xff0c;由最初的C接口变成现在的C接口&#xff0c;让开发者写程序越来越简单&#xf…

【1++的C++进阶】之智能指针

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的C进阶】 文章目录 一&#xff0c;什么是智能指针二&#xff0c;为什么需要智能指针三&#xff0c;智能指针的发展 一&#xff0c;什么是智能指针 要了解智能指针&#xff0c;我们先要了解RA…

C++标准库---智能指针auto_ptr初探

1.智能指针auto_ptr C标准库程序提供的auto_ptr是一种智能型指针&#xff08;smart pointer&#xff09;&#xff0c;帮助程序员防止“被异常抛出时发生资源泄漏”。注意auto_ptr只是针对一种特殊情况设计的&#xff0c;对于其他问题auto_ptr无能为力。 auto_ptr的接口与一般…

【C++干货铺】 RAII实现智能指针

个人主页点击直达&#xff1a;小白不是程序媛 C系列专栏&#xff1a;C干货铺 代码仓库&#xff1a;Gitee 目录 为什么需要智能指针&#xff1f; 内存泄漏 什么是内存泄漏&#xff0c;内存泄露的危害 内存泄漏的分类 堆内存泄漏&#xff08;Heap leak&#xff09; 系统资…

C++标准库---const auto_ptr特性

在使用auto_ptr的时候很容易就会发生拥有权的转移&#xff0c;那么怎么才能防止这种情况发生呢&#xff1f; 常数型auto_ptr终止了“不经意转移拥有权”所带来的危险。 只要一个对象通过auto_ptr传递&#xff0c;就可以使用常数型auto_ptr来终结拥有权转移链&#xff0c;此后…

【C++内存管理】C++智能指针

文章目录 1. unique_ptr1.1 基本功能和特性1.2 管理动态数组1.3 可移动构造 (MoveConstructible) 和可移动赋值 (MoveAssignable)1.4 转移所有权1.5 自定义删除器1.6 使用make_unique创建unique_ptr1.7 避免原始指针操作 2. shared_ptr 共享智能指针2.1 创建 shared_ptr2.2 共享…

【C++】—— 智能指针

一、为什么需要智能指针 我们先来看一段代码 #include <iostream> #include <vector> #include <exception> using namespace std;void Test() {int* tmp (int*)malloc(sizeof(int)* 100);int* p new int;vector<int> v1(1000000000, 10);vector&l…

智能指针的使用以及模拟实现

文章目录 智能指针内存泄漏智能指针的使用和原理 C98/C11智能指针auto_ptrunique_ptrshared_ptrweak_ptr 删除器总结 智能指针 在C语言中&#xff0c;我们初识了指针这一概念&#xff0c;在C中&#xff0c;我们不断对于指针进行研究和使用&#xff0c;指针的存在是C/C的一大特…

C++智能指针之unique_ptr(保姆级教学)

目录 unique_ptr 概述 涉及程序 初始化 手动初始化 std::make_unique函数&#xff08;C14&#xff09; unique_ptr常规操作 不支持操作&#xff1a;该指针不支持拷贝和赋值操作&#xff1b;所以不能拷贝到容器里 移动语义std::move(); release(); reset(); *解应用…

智能指针(Newbie Note)

智能指针专题 1.普通指针的问题2.智能指针是什么什么是所有权 3.智能指针三个好处&#xff1a;4.C11提供的智能指针4.1 shared_ptr&#xff08;共享所有权指针&#xff09;4.1.1 分配内存4.1.2 成员函数4.1.3 计数情况汇总&#xff1a;4.1.4 示例代码(计数)4.1.5 示例代码(rese…

杂货边角(24):C++智能指针和垃圾回收

目录&#xff1a; Sec1 C C98的显式内存管理的不足Sec2 C11的智能指针Sec3 垃圾回收机制 Sec1. C / C98的显式内存管理的不足 内存管理和垃圾回收是高级语言的重要特征&#xff0c;尤其是随着代码抽象程度的加深&#xff0c;C以及C98将内存管理完全交给程序员的做法一直是让…

智能指针管理“newed对象”

为什么要有智能指针&#xff1f; 指针智能是管理管理动态内存分配对象的一种机制。它提供了自动管理内存&#xff0c;避免常见内存泄漏和悬空指针。 对于上述Func函数的操作&#xff0c;一不小心就会产生很多问题。 p1 new时候抛异常 什么都不做p2 new时候抛异常 p1需要被清理…

C++智能指针(二)——weak_ptr初探

文章目录 1. shared_ptr 存在的问题2. 使用weak_ptr2.1 初始化 weak_ptr2.2 访问数据 1. shared_ptr 存在的问题 与 shared_ptr 的引入要解决普通指针存在的一些问题一样&#xff0c;weak_ptr 的引入&#xff0c;也是因为 shared_ptr 本身在某些情况下&#xff0c;存在一些问题…

Qt基础之四十三:Qt智能指针(QPointer、QSharedPointer、QWeakPointer和QScopedPointer)

一.QPointer QPointer是一个模板类,用于指向QObject或其派生类对象。当QPointer指向的对象销毁时,它会被自动设置为nullptr(在QObject析构时),这和普通C++指针是不同的(普通的C++指针delete后会变为“悬空指针”,需要手动设置为nullptr)。 QPointer的使用场景:QPoint…

智能指针专题

一、智能指针内存泄漏是软件工程中常见的bug&#xff0c;在C语言中&#xff0c;由于经常需要动态的申请堆空间&#xff0c;经常会忘记归还堆空间&#xff0c;C语言没有垃圾回收机制&#xff08;JAVA、Pathon有&#xff09;&#xff0c;所以指针无法控制所指向堆空间的生命周期。…

设计模式:简单工厂模式

简单工厂模式不是一个标准的设计模式&#xff0c;但却十分常用。 目录1. 简单工厂的概念2. 简单工厂的优缺点3. 何时选用简单工厂&#xff1f;1. 简单工厂的概念 提供一个创建对象的实例的功能&#xff0c;而无需关心其具体的实现&#xff1b;被创建的类型可以是接口、抽象类、…

C++智能指针之shared_ptr原理和应用举例

shared_ptr是C中的智能指针&#xff0c;它提供了共享所有权的能力。以下是shared_ptr的原理和特点&#xff1a; 先说原理&#xff1a; 1. shared_ptr使用引用计数的方式来管理对象的生命周期。 2. 每个shared_ptr都有一个关联的引用计数&#xff0c;用于统计有多少个指针共享…

C++中智能指针概念及模拟实现

目录1. 什么是智能指针&#xff1f;2. 提出智能指针的目的是什么&#xff1f;3. 智能指针的版本及简单模拟实现3.1 auto_ptr3.2 boost库中智能指针3.3 unique_ptr3.4 shared_ptr1. 什么是智能指针&#xff1f; 智能指针是一种托管资源空间的技术&#xff0c;可以访问空间、模拟…

boost智能指针shared_ptr Assertion px != 0 failed

这个问题的出现是因为没有正确的初始化智能指针&#xff0c;而且你又用了这个未初始化的智能指针。 如&#xff1a; boost::shared_ptr<Obj> obj; obj->Something(); // assertion failed而正确的初始化应该这样&#xff1a; boost::shared_ptr<Obj> obj(new …

c++智能指针(五)之weak_ptr

weak_ptr weak_ptr是一种不控制所指向对象的生存期的智能指针&#xff0c;它指向由一个shared_ptr所管理的对象。将一个weak_ptr绑定到shared_ptr上面不会改变shared_ptr的引用计数。 一旦最后一个指向对象的shared_ptr被销毁&#xff0c;对象就会被释放。 创建 auto p ma…

c++之智能指针(一)之动态内存与智能指针

动态内存与智能指针 在c中&#xff0c;动态内存的管理是通过一对运算符来完成的&#xff1a;new&#xff1a; 在动态内存中为对象分配空间并返回一个指向该对象的指针。delete: 接受一个动态对象的指针并销毁该对象&#xff0c;并释放与之关联的内存。 例子 //新建一个动态数…

智能指针.

目录 一、智能指针的使用及其原理 1.RAII 2.智能指针的原理 二、智能指针 1.auto_ptr 2.scoped_ptr 3.unique_ptr 4.shared_ptr 4.shared_array 5.weak_ptr 三、C11与boost中智能指针的关系 一、智能指针的使用及其原理 1.RAII RAII&#xff08;Resource Acquisiti…

C++:指针:智能指针

1&#xff1a;引用计数&#xff1a; 引用计数是为了防止内存泄漏而产生的一种方法&#xff0c;其基本思想是对于动态分配的对象&#xff0c;进行引用计数&#xff0c;每当增加一次对对象的引用&#xff0c;那么引用对象的引用计数就正价一次&#xff0c;每删除一次引用&#xf…

【C++】关于多线程,你应该知道这些

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《吃透西嘎嘎》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;多线程相…

深入浅出C++ ——智能指针

文章目录 智能指针的使用及原理RAII智能指针的原理std::auto_ptrstd::unique_ptrstd::shared_ptrstd::shared_ptr的线程安全问题std::shared_ptr的循环引用weak_ptr 智能指针的使用及原理 RAII RAII&#xff08;Resource Acquisition Is Initialization&#xff09;是一种利用…

智能指针——浅析

智能指针gitee 本人不才&#xff0c;只能将智能指针介绍一下&#xff0c;无法结合线程进行深入探索 介绍及作用 在异常产生进行跳转时&#xff0c;通过栈帧回收进行内存释放&#xff0c;防止内存泄漏 基于RAII思想可以创建出只能指针 RAII(Resource Acquisition Is Initiali…

c++智能指针(面试)

参考如下文章 智能指针原理介绍 智能指针模拟源码实现