/* 智能指针weak_ptr */

#include <iostream>
#include <string>
#include <memory> /*
weak_ptr 是一种不控制对象生命周期的智能指针, 它指向一个 shared_ptr 管理的对象.
进行该对象的内存管理的是那个强引用的 shared_ptr. weak_ptr只是提供了对管理对象的一个访问手段.
weak_ptr 设计的目的是为配合 shared_ptr 而引入的一种智能指针来协助 shared_ptr 工作,
它只可以从一个 shared_ptr 或另一个 weak_ptr 对象构造, 它的构造和析构不会引起引用记数的增加或减少.
weak_ptr 定义在 memory 文件中(非memory.h), 命名空间为 std. weak_ptr 初始化:
方式一:构造函数构造
std::shared_ptr<int> sp(new Student);
std::weak_ptr<int> wp(sp); 方式二:赋值初始化
std::shared_ptr<int> sp(new int(10));
wp = sp; 方式三:通过weak_ptr 对象构造 */ /*
成员函数
weak_ptr 没有重载*和->但可以使用 lock 获得一个可用的 shared_ptr 对象. 注意, weak_ptr 在使用前需要检查合法性.
expired 用于检测所管理的对象是否已经释放, 如果已经释放, 返回 true; 否则返回 false.
lock 用于获取所管理的对象的强引用(shared_ptr). 如果 expired 为 true, 返回一个空的 shared_ptr; 否则返回一个 shared_ptr,
其内部对象指向与 weak_ptr 相同.
use_count 返回与 shared_ptr 共享的对象的引用计数.
reset 将 weak_ptr 置空.
weak_ptr 支持拷贝或赋值, 但不会影响对应的 shared_ptr 内部对象的计数.
*/ struct Student
{
public:
Student(std::string name_, int age_) :name(name_), age(age_) {}
std::string name;
int age;
}; void test()
{
//初始化方式一
std::shared_ptr<Student> sp1(new Student("tom",));
std::weak_ptr<Student> wp1(sp1); //初始化方式二
std::weak_ptr<Student> wp2 = sp1; //初始化方式三
std::weak_ptr<Student> wp3 = wp2; //weak_ptr 在使用前需要检查合法性
if (!wp3.expired())
{
//weak_ptr 没有重载*和->但可以使用 lock 获得一个可用的 shared_ptr 对象
std::shared_ptr<Student> tmp = wp3.lock();
printf("name is [%s] .\n", tmp->name.c_str());
} std::weak_ptr<Student> wp4;
{
std::shared_ptr<Student> sp2(new Student("jack",));
wp4 = sp2;
printf("%d\n", wp4.use_count()); //
wp4.reset();
printf("%d\n", wp4.use_count()); //
printf("%d\n", sp2.use_count()); // 1
//weak_ptr不会影响引用记数的增加或减少
}
//当weak_ptr引用对象被析构之后,lock(0方法返回值为NULL
std::shared_ptr<Student> spnull = wp4.lock();
if (NULL == spnull)
{
printf("shared_ptr is not Usable .\n");
}
} int main()
{
test();
getchar();
return ;
}

C++ 智能指针七的更多相关文章

  1. C++2.0新特性(七)——<Smart Pointer(智能指针)之weak_ptr>

    一.weak_ptr出现的意义 上一节提到过shared_ptr,它会自动释放“不再需要使用的对象”的相应的资源,但是它不是万能的,在某些时候(比如说循环引用),它会显得力不从心,这就是weak_pt ...

  2. Binder学习笔记(十一)—— 智能指针

    轻量级指针 Binder的学习历程爬到驱动的半山腰明显感觉越来越陡峭,停下业务层的学习,补补基础层知识吧,这首当其冲的就是智能指针了,智能指针的影子在Android源码中随处可见.打开framewor ...

  3. (转)Delphi2009初体验 - 语言篇 - 智能指针(Smart Pointer)的实现

     转载:http://www.cnblogs.com/felixYeou/archive/2008/08/27/1277250.html 快速导航 一. 回顾历史二. 智能指针简介三. Delphi中 ...

  4. 你说你会C++? —— 智能指针

    智能指针的设计初衷是:      C++中没有提供自己主动回收内存的机制,每次new对象之后都须要手动delete.稍不注意就memory leak. 智能指针能够解决上面遇到的问题. C++中常见的 ...

  5. enote笔记法使用范例(2)——指针(1)智能指针

    要知道什么是智能指针,首先了解什么称为 “资源分配即初始化” what RAII:RAII—Resource Acquisition Is Initialization,即“资源分配即初始化” 在&l ...

  6. C++11 shared_ptr 智能指针 的使用,避免内存泄露

    多线程程序经常会遇到在某个线程A创建了一个对象,这个对象需要在线程B使用, 在没有shared_ptr时,因为线程A,B结束时间不确定,即在A或B线程先释放这个对象都有可能造成另一个线程崩溃, 所以为 ...

  7. C++智能指针

    引用计数技术及智能指针的简单实现 基础对象类 class Point { public: Point(int xVal = 0, int yVal = 0) : x(xVal), y(yVal) { ...

  8. EC笔记:第三部分:17、使用独立的语句将newed对象放入智能指针

    一般的智能指针都是通过一个普通指针来初始化,所以很容易写出以下的代码: #include <iostream> using namespace std; int func1(){ //返回 ...

  9. 智能指针shared_ptr的用法

    为了解决C++内存泄漏的问题,C++11引入了智能指针(Smart Pointer). 智能指针的原理是,接受一个申请好的内存地址,构造一个保存在栈上的智能指针对象,当程序退出栈的作用域范围后,由于栈 ...

随机推荐

  1. 2016-2017 National Taiwan University World Final Team Selection Contest

    A. Hacker Cups and Balls 二分答案,将$\geq mid$的数看成$1$,$<mid$的数看成$0$,用线段树进行区间排序检查即可.时间复杂度$O(n\log^2n)$. ...

  2. [P4994]终于结束的起点 (递推)

    终于结束的起点 终于写下句点 终于我们告别 终于我们又回到原点 …… 一个个 OIer 的竞赛生涯总是从一场 NOIp 开始,大多也在一场 NOIp 中结束,好似一次次轮回在不断上演. 如果这次 NO ...

  3. GDOI2017爆炸记

    100种方法教你爆零.. 总结 其实这一次比赛除了三个sb的错误还是收获到了很多的.. 起码自己已经知道自己有进队的实力 不足的地方很大 主要是脑子不太好使,题目要不只能拿最暴力的分要不就能a 看了很 ...

  4. Java 不变模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述不变(Immutable)模式的:一个对象的状态在对象被创建之后就不再变化,这就是所谓的不变模式. 不变模式的结构 不变模式可增强对象的健 ...

  5. java第二周的学习知识2

    sPrimitive() 判断是否为基本类型,Class.isPrimitive(),原始类型下返回true. for(Size value:Size.values()) { //此代码中的value ...

  6. PHP 中的魔法常数

    PHP中的魔法常数 PHP中有很多描述当前状态的魔法函数,可以很方便地获取运行时的局部环境 测试代码及结果如下 <?php namespace NS { function writeln($v= ...

  7. Selenium环境搭建---C#

    最近在学习Selenium,主要看的是C#版和java版,目前先搭建好了C#的环境,java的后期再搭建,这里先总结一下在vs2013里搭建环境时所遇到的坑,以便分享和后期避免. 首先就是seleni ...

  8. 小甲鱼Python第六讲课后习题

    python中被看作假:FALSE  none 0  ‘ ’  " "  ( ) [ ] { },其他一切都被解释为真 0.Python 的 floor 除法现在使用“//”实现, ...

  9. poj1182 食物链(并查集 好题)

    https://vjudge.net/problem/POJ-1182 并查集经典题 对于每只动物创建3个元素,x, x+N, x+2*N(分别表示x属于A类,B类和C类). 把两个元素放在一个组代表 ...

  10. 9、js扩展

    作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理. 本片导航: js的作用域 作用域链(Scope Chain) 一. ...