news 2026/10/14 3:33:41

C++学习日记 Day20:C++11(中) 智能指针

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++学习日记 Day20:C++11(中) 智能指针

## 今天学了什么

今天学习C++11的智能指针:共享智能指针(shared_ptr)、独占智能指针(unique_ptr)、弱引用智能指针(weak_ptr)。

头文件<memory>

## shared_ptr

①初始化

Ⅰ.通过构造函数进行初始化:

shared_ptr<int> ptr1(new int);

Ⅱ.通过拷贝构造初始化:

shared_ptr<int> ptr2 = ptr1;

Ⅲ.移动构造:

shared_ptr<int> ptr3 = move(ptr2);

Ⅳ.make_shared初始化

shared_ptr<int> ptr4 = make_shared<int>(1);

Ⅴ.reset

ptr3.reset(new int);

②共享智能指针使用

Ⅰ.获取原始地址

shared_ptr<Test> ptr(new Test);
Test *t = ptr.get();
t->ptintInfo();

Ⅱ.通过智能指针直接对对象进行操作

ptr->ptintInfo();

③删除器

对于特殊情况/非堆资源的内存释放,默认删除器(default_delete())无法释放,需要手动写删除器。

例:当new了一个数组,默认删除器无法全部释放,手动写如下:

  • shared_ptr<Test> ptr3(new Test[5], [](Test* t) { delete[] t; }); //5
  • shared_ptr<Test> ptr5(new Test[5], default_delete<Test[]>()); //1
  • shared_ptr< Test[]> ptr4(new Test[5]); //5 C++11以后支持

④使用 shared_ptr 注意事项

Ⅰ.不能使用一个原始地址初始化多个智能指针

Test* t = new Test(5);
shared_ptr< Test> ptr(t);
shared_ptr< Test> ptr2=ptr; ✔ // shared_ptr< Test> ptr2(t); ✘

Ⅱ.函数不能返回管理了this的智能指针对象

shared_ptr< Test> ptr3;
ptr3=ptr2->GetSharedPtr();

//shared_ptr<Test> GetSharedPtr(){return shared_ptr<Test>(this);}

解决方法:

struct Test : public enable_shared_from_this<Test>{ … //返回管理了this的共享指针 shared_ptr<Test> GetSharedPtr() { return shared_from_this(); }

Ⅲ.不能循环引用

将shared_ptr<TB> bptr; 改为 weak_ptr<TB> bptr; 以解决循环引用无法析构问题。

class TB; class TA { public: weak_ptr<TB> bptr; ~TA() { cout << "TA 的析构" << endl; } }; class TB { public: shared_ptr<TA> aptr; ~TB() { cout << "TB 的析构" << endl; } };

shared_ptr<TA> a(new TA);
shared_ptr<TB> b(new TB);

a->bptr = b;

b->aptr = a;

## unique_ptr

①初始化

Ⅰ.通过构造函数进行初始化:

unique_ptr<int> ptr(new int);

Ⅱ.移动构造:

unique_ptr<int> ptr2=move(ptr);

Ⅲ.reset

ptr2.reset(new int);

*注:unique_ptr不能通过拷贝构造初始化,原因:一块内存,同一时间只能有1个unique_ptr持有它,不能共享。

②独占智能指针使用

Ⅰ.获取原始地址

unique_ptr< Test> ptr(new Test);
Test* t = ptr.get();
t->func();

Ⅱ.通过智能指针直接对对象进行操作

ptr->func();

③删除器

三种写法:

using ptrFunc = void(*)(Test*);

unique_ptr< Test,ptrFunc> ptr3(new Test[1], [](Test* t) {
delete[] t;
}); //[]无捕获,没有成员变量,编译器额外给他转成普通函数指针

unique_ptr< Test,function<void(Test*)>> ptr4(new Test[1], [=](Test* t) {
delete[] t;
}); //[=]有捕获,不能转,必须用function包装

unique_ptr<Test[]> ptr5(new Test[1]); //特点:管理数组类型的地址能自动释放

## weak_ptr

①初始化

通过共享智能指针实例化:

Ⅰ.

shared_ptr<int> sptr(new int);
weak_ptr<int> wptr2 = sptr;

Ⅱ.

weak_ptr<int> wptr3(wptr2);

Ⅲ.

weak_ptr<int> wptr;
weak_ptr<int> wptr4;

wptr = wptr2;

wptr4=sptr;

②常用方法

Ⅰ.use_count()(返回所监测资源的引用计数);

Ⅱ.expired()(判断观测的资源是否已经被释放);

if (wptr.expired())
{
cout << "已经释放" << endl;
}
else
{
cout << "weak_ptr 没有释放" << endl;
}

Ⅲ.lock()(获取管理监测对象资源的shared_ptr对象);

shared_ptr<int> sptr2 = wptr2.lock();

* 注:weak_ptr只是监测指针,不能直接解引用,没有 * 、->,不能直接访问资源,想访问只能调用 lock() 拿到shared_ptr。

③reset()重置

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/14 3:33:17

响应式设计+多端适配:全平台社区论坛小程序源码系统实战复盘

1. 项目动机&#xff1a;为什么论坛类产品是验证响应式与多端适配的试金石前阵子帮朋友落地了一个社区论坛类的产品需求&#xff0c;就是标题里这套"响应式设计多端适配&#xff0c;全平台社区论坛小程序源码系统"。立项前我们其实纠结了很久&#xff1a;同等投入去做…

作者头像 李华
网站建设 2026/10/14 3:32:57

C语言实现扫雷游戏(完整代码+详细注释)

扫雷是一款经典的益智游戏&#xff0c;规则简单却充满挑战。本文以 C 语言实现一个控制台版扫雷&#xff0c;面向刚接触编程的初学者&#xff0c;分享从需求分析、代码实现到功能优化的完整过程&#xff0c;希望能帮助大家更好地理解数组、函数与多文件编程。 一、扫雷游戏的分…

作者头像 李华
网站建设 2026/10/14 3:32:34

13 Validation校验在springboot中使用

1 引入依赖 Spring Boot 3.x 也使用这个 starter&#xff0c;但包名迁移到了 jakarta.validation。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId> </dependency>2…

作者头像 李华
网站建设 2026/10/14 3:32:04

强化学习的动态规划

一、动态规划的介绍1、动态规划动态规划 (Dynamic programming, DP)是一类优化算法动态规划将待求解问题分解成若干子问题&#xff0c;先求解子问题&#xff0c;然后从这些 子问题的解得到目标问题的解。2、动态规划与强化学习的关系在完备的马尔可夫决策过程中&#xff0c;DP可…

作者头像 李华
网站建设 2026/10/14 3:31:51

移动端射击游戏性能优化实战:帧率、渲染与手感调优全攻略

做移动端射击游戏&#xff0c;和做PC/主机射击游戏完全不是一个物种。去年我们团队把《三角洲行动》移动端的帧率、内存、发热和手感反复打磨了大半年&#xff0c;期间踩了大量文档里根本找不到的坑。这篇文章不讲教科书式的架构&#xff0c;而是把真机调试、压测和上线前优化过…

作者头像 李华
网站建设 2026/10/14 3:31:49

Codex Skill 入门与实战:安装、调用和自建

整理时间&#xff1a;2026-10-12 核心标签&#xff1a;#Codex #AgentSkills #AI编程 #效率工具 资料来源 [S1] 视频&#xff1a;《Codex Skill 到底是什么&#xff1f;10分钟入门使用、安装、自建》&#xff0c;Bilibili。[S2] 官方文档&#xff1a;Build skills&#xff08;O…

作者头像 李华