C++智能指针

区别于new,智能指针在不再使用对象时可以自动释放内存,而new需要手动添加释放

shared_ptr

unique_ptr

某时刻只能有一个unique_ptr指向一个给定的对象。当unique_ptr被销毁时,其所指的对象也被销毁。

注意:

  • 必须采用直接初始化方式unique_ptr<int> p2(new int(42));,默认初始化为nullptr.
  • 不支持普通拷贝unique_ptr<string> p2(p1) 或者赋值方式p3=p2
  • 对于一个将要被销毁的unique_str,可以拷贝,例如以下两种情况:
cpp 复制代码
//编译器知道函数返回的对象即将被销毁
unique_ptr<int> clone(int p) { //从函数返回一个unique_ptr
    return unique_ptr<int>(new int(p));
}
unique_ptr<int> clone(int p) { //返回一个局部对象的拷贝
    unique_ptr<int> ret(new int(p));
    return ret;
}
  • u.release() //放弃对指针的控制权,先返回指针再将指针置为空
  • u.reset(q) //如果提供了q,则将u指向q;否则将u置为空
  • unique_ptr默认情况下用delete释放它指向的对象,但可以重新删除器unique_ptr<objT,delT> p(new objT,fun) //第二个参数是删除器

weak_ptr

weak_ptr不控制所指对象的生存周期,指向一个由shared_ptr管理的对象。

  • weak_ptr不影响绑定的shared_ptr的引用计数。
  • 一旦指向对象的最后一个shared_ptr被销毁,对象就被销毁。

创建:

cpp 复制代码
auto p=make_shared<int>(42);
weak_ptr<int> wp(p);

访问:

cpp 复制代码
if(shared_ptr<int> np=wp.lock()){}//用lock()访问可以检查对象是否存在,存在便返回一个指向共享对象的shared_ptr

使用一个weak_ptr,访问vector元素时,不会影响给定的vector的生存周期,且可以组织用户访问一个不再存在的vector.

相关推荐
云泽8088 小时前
从零吃透 C++ 异常:抛出捕获、栈展开、异常重抛与编码规范详解
开发语言·c++·代码规范
灯澜忆梦8 小时前
GO---可见性规则
开发语言·golang
REDcker8 小时前
libdatachannel 快速入门
c++·webrtc·datachannel
逝水无殇8 小时前
C# 文件的输入与输出详解
开发语言·数据库·后端·c#
这是个栗子9 小时前
前端开发中的常用工具函数(八)
开发语言·前端·javascript
凤凰院凶涛QAQ9 小时前
《Java版数据结构 & 集合类剖析》栈与队列:“push/pop 是栈的灵魂,offer/poll 是队列的骨架——四组 API,两种人生”
java·开发语言·数据结构
研☆香10 小时前
为什么变量声明在赋值前也能使用?—— 深入理解 JavaScript 变量提升与作用域
开发语言·前端·javascript
右耳朵猫AI10 小时前
PHP周刊2026W28 | 安全更新、Laravel 13.18、Twig 3.28
开发语言·php·laravel
second6010 小时前
第一部分:快速上手 —— 建立 C++ 基本语法与编程范式
开发语言·c++
郝学胜-神的一滴10 小时前
算法实战:最小k个数——大顶堆的优雅解法
开发语言·数据结构·c++·python·程序人生·算法·排序算法