IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++智能指针 -> 正文阅读

[C++知识库]C++智能指针

智能指针

  • C++ 四种智能指针,auto_ptrshared_ptrweak_ptrunique_ptr,其中后面3个是 C++11 支持的,并且第一个以被弃用。

unique_ptr

  • 用于取代 c++98 的auto_ptrunique_ptr中的拷贝构造和赋值操作符delete了,所以也就意味着他和auto_ptr有区别,控制权唯一,不能随意变换,右值
  • 不支持赋值语义,只支持移动语义,无法进行普通赋值操作,但可以进行移动赋值操作,需 move() 显性进行。
  • 当程序试图将一个 unique_ptr 赋值给另一个时,如果源 unique_ptr 是个临时右值,编译器允许这么做;如果源 unique_ptr 将存在一段时间,编译器将禁止这么做,比如:
    unique_ptr<string> pu1(new string ("hello world")); 
    unique_ptr<string> pu2; 
    pu2 = pu1;                      // #1 不允许
    unique_ptr<string> pu3; 
    pu3 = unique_ptr<string>(new string ("xiaoming"));   // #2 允许
    
  • 注:如果确实想执行类似与 #1 的操作,要安全的重用这种指针,可给它赋新值。C++有一个标准库函数std::move(),让你能够将一个unique_ptr赋给另一个。尽管转移所有权后 还是有可能出现原有指针调用(调用就崩溃)的情况。但是这个语法能强调你是在转移所有权,让你清晰的知道自己在做什么,从而不乱调用原有指针。

shared_ptr

  • shared_ptr实现共享式拥有概念。多个智能指针可以指向相同对象,该对象和其相关资源会在“最后一个引用被销毁”时候释放。
    • 从名字share就可以看出了资源可以被多个指针共享,它使用计数机制来表明资源被几个指针共享。可以通过成员函数use_count()来查看资源的所有者个数。
    • 除了可以通过new来构造,还可以通过传入auto_ptr, unique_ptr,weak_ptr来构造。
    • 当我们调用release()时,当前指针会释放资源所有权,计数减一。当计数等于0时,资源会被释放。
  • 它允许共享资源,使用计数器记录资源被 n 个指针共享。
  • shared_ptr基于“引用计数”模型实现,多个shared_ptr可指向同一个动态对象,并维护了一个共享的引用计数器,记录了引用同一对象的shared_ptr实例的数量。当最后一个指向动态对象的shared_ptr销毁时,会自动销毁其所指对象(通过delete操作符)。
  • shared_ptr的默认能力是管理动态内存,但支持自定义的Deleter以实现个性化的资源释放动作。
  • shared_ptr 的线程安全问题:
    • 同一个shared_ptr被多个线程读,是线程安全。
    • 同一个shared_ptr被多个线程写,不是线程安全的。
    • 共享引用计数的不同的shared_ptr被多个线程写,是线程安全的。
      对于第三点,我们一般采用:
      对于线程中传入的外部shared_ptr对象,在线程内部进行一次新的构造,例如: sharedptr AObjTmp = outerSharedptrObj;

weak_ptr

  • weak_ptr用于解决“引用计数”模型循环依赖问题,weak_ptr指向一个对象,并不增减该对象的引用计数器。
  • weak_ptr 用于解决 shared_ptr 相互引用时的死锁问题,如果说 shared_ptr 相互引用,计数器永远不会是0,资源不被释放,weak_ptr 是对象的弱引用,不会增加对象的引用次数,和 shared_ptr 相互转化,shared_ptr可直接赋值,他可以通过lock() 函数获得 shared_ptr
  • weak_ptr指向shared_ptr指针指向的对象的内存,却并不拥有该内存。 但是,使用weak_ptr成员lock,则可返回其指向内存的一个shared_ptr对象,且在所指对象内存已经无效时,返回指针空值(nullptr)。
  • 由于weak_ptr是指向shared_ptr所指向的内存的,所以,weak_ptr并不能独立存在。

案例

#include <iostream>
#include <memory>

void Check(const weak_ptr<int> &wp)
{
    shared_ptr<int> sp = wp.lock(); // 重新获得shared_ptr对象
    if (sp != nullptr) {
        cout << "The value is " << *sp << endl;
    } else {
        cout << "Pointer is invalid." << endl;
    }
}

int main() {

	shared_ptr<int> sp1(new int(10));
	shared_ptr<int> sp2 = sp1;	// 赋值
	weak_ptr<int> wp = sp1; // 指向sp1所指向的内存
	cout << *sp1 << endl;  // output: 10
	cout << *sp2 << endl;  // output: 10
	Check(wp);  // The value is 10
	sp1.reset();
	cout << *sp2 << endl;  // output: 10
	Check(wp);  // The value is 10
	sp2.reset();
	Check(wp);	// Pointer is invalid.
	return 0;
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-07 22:27:40  更:2022-04-07 22:29:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:40:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码