关闭

std::shared_ptr简介

标签: C++C++11std
672人阅读 评论(0) 收藏 举报
分类:

原文: http://www.cplusplus.com/reference/memory/shared_ptr/


template<class T> class shared_ptr;


共享指针(shared pointer)管理指针的存储,提供有限的垃圾回收的功能,可能会与其他对象共享此指针管理。


shared_ptr类型的对象具有获得一个指针所有权的能力,并且能分享此所有权: 一旦取得了所有权,当最后一个所有者释放所有权的时候,这些所有者就要负责删除指针。


一旦shared_ptr对象被销毁(destroyed) ,或者一旦它们的值通过赋值操作符或显式调用shared_ptr::reset而被改变的时候,share_ptr对象就释放了对原来对象的所有权。一旦所有的shared_ptr对象(共享一个指针的所有权的对象)都释放了所有权,该被管理的对象就会被删除(一般通过调用::delete来删除),但(如需不同的删除方法)一个不同的deleter可能在构造函数中被指定。


shared_ptr对象可以仅仅通过复制它们的值来共享所有权:如果2个shared_ptr被构造自同一个非shared_ptr指针,它们两个都会拥有这个指针而并不share它。这会导致潜在的访问问题:当这2个shared_ptr其中之一release了这个指针(即删除了所指对象)时,另一个shared_ptr就会指向一个无效的地址。


另外,shared_ptr对象可以在共享某个指针的所有权的同时,其实指向的时另一个对象。这个能力被称为别名(aliasing),它一般被用来指向成员对象,但拥有这些成员对象所属的对象。因此,一个shared_ptr其实和以下2个指针相关:
- a stored pointer,就是所指向的指针,也就是用operator *来解引用的那个指针,也就是用get()得到的那个指针;
- An owned pointer(可能被共享的),也就是这些所有者(ownership group)可以去deleting的指针,也就是对其进行使用计数的那个指针。


一般来说,stored pointer和owned pointer指向相同的东西,但是alias shared_ptr对象(用alias constructor构建的对象和它们的copy)的这2个指针却可能指向不同的对象。


一个并不拥有任何指针的shared_ptr被称作empty shared_ptr. 
一个什么对象都不指向的shared_ptr被称作 null shared_ptr,并且不能被解引用(dereferenced). 
一个empty shared_ptr不一定是一个null shared_ptr,反之亦然。


通过operator *和operator ->以访问所指向的对象,shared_ptr复制了有限的指针功能。因为安全的原因,shared_ptr对象不提供指针运算。


一个相关的类,weak_ptr,能够和shared_ptr对象共享指针却并不拥有它们。

0
0
查看评论

c++11 条款19:使用std::shared_ptr来进行共享所有权的资源管理

条款19:使用std::shared_ptr来进行共享所有权的资源管理 使用垃圾回收的程序员会嘲笑c++程序员阻止资源泄漏的方法,“好原始啊!”他们嘲笑。“你们没有在1960年代从Lisp里获取备忘录吗?机器应该管理资源的生存期,而不是人”。C++翻着眼睛说,“你的意思是备忘录里说的资源只是内存,并...
  • coolmeme
  • coolmeme
  • 2015-01-28 17:27
  • 8958

share_ptr的正确使用方法

实在是看不惯度娘出来的share ptr的例子,没有实用性,而且还不清晰,举一个场景如下: 假设游戏玩家登陆时要登记到一个管理用的vector中,登出时删除,程序如下: 注意对象时在函数结束时才被释放的。 #include #include #include #includ...
  • _stdHans
  • _stdHans
  • 2015-07-13 16:13
  • 77

c++中的std::shared_ptr和std::weak_ptr

转载自:http://blog.csdn.net/dlite/article/details/8010873 后续的技术学习待续。
  • In_Zihuatanejo
  • In_Zihuatanejo
  • 2016-08-17 14:03
  • 413

std::shared_ptr 和 std::weak_ptr的用法以及引用计数的循环引用问题

在std::shared_ptr被引入之前,C++标准库中实现的用于管理资源的智能指针只有std::auto_ptr一个而已。std::auto_ptr的作用非常有限,因为它存在被管理资源的所有权转移问题。这导致多个std::auto_ptr类型的局部变量不能共享同一个资源,这个问题是非常严重的哦。...
  • shanno
  • shanno
  • 2012-03-17 10:56
  • 30088

C++11中shared_ptr的使用

C++11中shared_ptr的使用
  • fengbingchun
  • fengbingchun
  • 2016-08-13 22:22
  • 11926

智能指针share_ptr使用过程中需要注意的几点

智能指针在boost中很早就有了,在tr1上也很早,但是没怎么用,后来0x标准出来之后,智能指针变成了标准库,所以现在用起来就不区分boost和std了。 主要说下share_ptr的几个注意点,待补全。 1.环状的链式结构可能会形成内存泄露 例如: class BaseClass; cla...
  • yusiguyuan
  • yusiguyuan
  • 2014-11-05 21:19
  • 4707

std::shared_ptr的巧妙应用

std::shared_ptr 一次创建,多处共享,通过引用计数控制生命周期。 问题: 假设有一项任务Task,其分为N个小模块,每个小模块都是并发执行。 现在要求,任务开始,每个小模块并发执行,在全部小模块执行完后,将所有小模块结果进行下一步处理,任务结束。 方案一: 任务开始,先创建一个成员变量...
  • zhoujielunzhimi
  • zhoujielunzhimi
  • 2016-06-06 11:34
  • 875

小测试:boost之shared_ptr在容器类std::list中的使用

一个小测试:在std::list容器中使用shared_ptr,演示了对象的添加与删除的多种方式:通过原始指针(raw pointer)、智能指针(smart pointer)、迭代器(iterator)、boost::enable_shared_from_this等。例子中的代码只做演示用,实际使...
  • dyw
  • dyw
  • 2010-09-26 11:05
  • 3703

Effective Modern C++ 条款19 用std::shared_ptr管理共享所有权的资源

Effective Modern C++ 条款19
  • big_yellow_duck
  • big_yellow_duck
  • 2016-08-26 19:08
  • 1177

C++ - "shared_ptr"的使用方法 及 代码

"shared_ptr"的使用方法 及 代码   智能指针(smart pointer)是C++11的新特性. 指针在无人使用时, 自动释放动态内存. 通过"use_count"计数, 并判断是否无人使用, 从而释放内存. 在函数复制(c...
  • u012515223
  • u012515223
  • 2013-11-04 09:45
  • 2892
    个人资料
    • 访问:192756次
    • 积分:3199
    • 等级:
    • 排名:第12700名
    • 原创:106篇
    • 转载:39篇
    • 译文:28篇
    • 评论:25条
    最新评论