详解C++ 中 shared_ptr weak_ptr

 更新时间:2022年07月23日 10:54:29   作者:vaughn.huang  
shared_ptr 是一个标准的共享所有权的智能指针,允许多个指针指向同一个对象,定义在 memory 文件中,命名空间为 std,这篇文章主要介绍了C++ 中 shared_ptr weak_ptr,需要的朋友可以参考下

shared_ptr

shared_ptr 是一个标准的共享所有权的智能指针,允许多个指针指向同一个对象,定义在 memory 文件中,命名空间为 std。shared_ptr最初实现于Boost库中,后由 C++11 引入到 C++ STL。shared_ptr 利用引用计数的方式实现了对所管理的对象的所有权的分享,即允许多个 shared_ptr 共同管理同一个对象。

std::shared_ptr<int> sp1 = new int();  // shared count = 1, weak count = 0
std::shared_ptr<int> sp2(sp1);         // shared count = 2, weak count = 0
std::shared_ptr<int> sp3 = sp2;        // shared count = 3, weak count = 0

std::weak_ptr<int> wp1(sp1);           // shared count = 3, weak count = 1
std::weak_ptr<int> wp2(wp1);           // shared count = 3, weak count = 2
std::weak_ptr<int> wp3 = wp2;          // shared count = 3, weak count = 3

shared_ptr weak_ptr 使用 reset 或者指向另一个 managed object导致 shared count或weak count相应的减一。

1.类继承中使用shared_ptr

class Base {};
class Derived : public Base {};
......
shared_ptr<Derived> dp1(new Derived);
shared_ptr<Base> bp1 = dp1;
shared_ptr<Base> bp2(dp1);
shared_ptr<Base> bp3(new Derived);

2.casting shared_ptr

shared_ptr<Base> base_ptr (new Base);
shared_ptr<Derived> derived_ptr;
// if static_cast<Derived *>(base_ptr.get()) is valid, then the following is valid:
derived_ptr = static_pointer_cast<Derived>(base_ptr);

3.make_shared

使用shared_ptr = new int(),会导致两次内存分配:int对象的内存分配跟shared_ptr内部的 manager object 一次内存分配。make_shared 对此进行了优化,一次性分配 int + manager object 内存空间大小。
make_shared 用法:

shared_ptr<Thing> p (make_shared<Thing>(42, "I'm a Thing!"));
shared_ptr<Base> bp(make_shared<Derived1>());     // shared_ptr中的 template参数与make_shared中的tmeplate参数可以不一样(继承关系)

使用 weak_ptr

void do_it(weak_ptr<Thing> wp){
shared_ptr<Thing> sp = wp.lock(); // get shared_ptr from weak_ptr
if(sp)
sp->defrangulate(); // tell the Thing to do something
else
cout << "The Thing is gone!" << endl;
}

也可以直接从weak_ptr构建shared_ptr,这个时间如果weak_ptr过期(通过 weak_ptr::expired() 可以查询),则抛出异常:

void do_it(weak_ptr<Thing> wp){
shared_ptr<Thing> sp(wp); // construct shared_ptr from weak_ptr
// exception thrown if wp is expired, so if here, sp is good to go
sp->defrangulate(); // tell the Thing to do something
}

到此这篇关于C++ 中 shared_ptr weak_ptr的文章就介绍到这了,更多相关C++  shared_ptr weak_ptr内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言实现扫雷项目

    C语言实现扫雷项目

    这篇文章主要为大家详细介绍了C语言实现扫雷项目,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • C语言中数据如何存储进内存揭秘

    C语言中数据如何存储进内存揭秘

    使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着,当您创建一个变量时,就会在内存中保留一些空间。您可能需要存储各种数据类型的信息,操作系统会根据变量的数据类型,来分配内存和决定在保留内存中存储什么
    2022-08-08
  • C语言设计模式之命令模式介绍

    C语言设计模式之命令模式介绍

    大家好,本篇文章主要讲的是C语言设计模式之命令模式介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2022-01-01
  • C++数据结构之实现邻接表

    C++数据结构之实现邻接表

    这篇文章主要为大家详细介绍了C++数据结构之实现邻接表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • 一文详解如何在VS Code上搭建C/C++开发环境

    一文详解如何在VS Code上搭建C/C++开发环境

    VSCode是由微软开发的一款免费、开源、跨平台的文本编辑器,它具有许多强大的功能,这篇文章主要给大家介绍了关于如何在VS Code上搭建C/C++开发环境的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2024-03-03
  • C++中unique函数的用法示例

    C++中unique函数的用法示例

    nique()是C++标准库函数里面的函数,下面这篇文章主要给大家介绍了关于C++中unique函数用法的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧
    2019-02-02
  • C语言 指针与数组的详解及区别

    C语言 指针与数组的详解及区别

    这篇文章主要介绍了C语言 指针与数组的详解及对比的相关资料,需要的朋友可以参考下
    2017-03-03
  • C++中的数组引用和指针引用

    C++中的数组引用和指针引用

    这篇文章主要介绍了C++中的数组引用和指针引用详细的相关资料,需要的朋友可以参考下面文章内容
    2021-09-09
  • C语言 sockaddr和sockaddr_in案例详解

    C语言 sockaddr和sockaddr_in案例详解

    这篇文章主要介绍了C语言 sockaddr和sockaddr_in案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Win32应用程序(SDK)设计原理详解

    Win32应用程序(SDK)设计原理详解

    这篇文章主要介绍了Win32应用程序(SDK)设计原理,对于理解win32应用程序运行原理有很大的帮助,需要的朋友可以参考下
    2014-08-08

最新评论