/* 智能指针enable_shared_from_this模板类使用 */

#include <iostream>
#include <string>
#include <memory> //智能指针头文件 /*
enable_shared_from_this适用场合:
当类A被share_ptr管理,且在类A的成员函数里需要把当前类对象作为参数传给其他函数时,就需要传递一个指向自身的share_ptr。 1.为何不直接传递this指针
        使用智能指针的初衷就是为了方便资源管理,如果在某些地方使用智能指针,某些地方使用原始指针,很容易破坏智能指针的语义,从而产生各种错误。 2.可以直接传递share_ptr<this>么?
        答案是不能,因为这样会造成2个非共享的share_ptr指向同一个对象,未增加引用计数导对象被析构两次。 shared_from_this返回的share_ptr会和自身的share_ptr共享一个对象
*/ class Student:public std::enable_shared_from_this<Student>
{
public:
std::shared_ptr<Student> getPtr()
{
//这个会产生一个新的std::shared_ptr<Student>对象
//return std::shared_ptr<Student>(this);
//正确用法
//return shared_from_this();
}
private:
std::string _name;
int age;
}; void test()
{
//错误的示例,每个shared_ptr都认为自己是对象仅有的所有者
std::shared_ptr<Student> stu1 = std::make_shared<Student>();
std::shared_ptr<Student> stu2 = stu1->getPtr(); //打印引用计数
printf("stu1 use_count [%d] .\n", stu1.use_count()); //打印1
printf("stu2 use_count [%d] .\n", stu2.use_count()); //打印1 //Student对象将会被析构2次,触发断点
} int main()
{
test();
getchar();
return ;
}

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

  1. 深入学习c++--智能指针(四)--使用建议

    1. 不要自己手动管理资源 2. 一个裸指针不要用两个shared_ptr管理,unique_ptr 3. 使用shared_ptr作为函数的接口,如果有可能用 const shared_ptr&am ...

  2. stl中auto_ptr,unique_ptr,shared_ptr,weak_ptr四种智能指针使用总结

    stl中auto_ptr,unique_ptr,shared_ptr,weak_ptr四种智能指针使用总结 1. auto_ptrauto_ptr主要是用来解决资源自动释放的问题,比如如下代码:voi ...

  3. c++中的四种智能指针

    c++中的四种智能指针 写惯了python,golang再来写c++总觉得头大,很大一个原因就是他没有一个GC机制. 不过c++中提供了智能指针,也不是不能用,李姐万岁! auto_ptr, shar ...

  4. 转载:STL四种智能指针

    转载至:https://blog.csdn.net/K346K346/article/details/81478223 STL一共给我们提供了四种智能指针: auto_ptr.unique_ptr.s ...

  5. 【C++】智能指针简述(四):shared_ptr

    在开始本文内容之前,我们再来总结一下,前文内容: 1.智能指针采用RAII机制,在构造对象时进行资源的初始化,析构对象时进行资源的清理及汕尾. 2.auto_ptr防止拷贝后析构释放同一块内存,采用& ...

  6. C++中的四个智能指针

    只能指针的行为类似常规指针,重要的区别是它负责自动释放所指向的对象.智能指针定义在memory头文件中. 1. auto_ptr(C++11已经舍弃) 由new expression获得的对象,在au ...

  7. C++面试题(四)——智能指针的原理和实现

    C++面试题(一).(二)和(三)都搞定的话,恭喜你来到这里,这基本就是c++面试题的最后一波了.     1,你知道智能指针吗?智能指针的原理.     2,常用的智能指针.     3,智能指针的 ...

  8. 基于C/S架构的3D对战网络游戏C++框架 _05搭建系统开发环境与Boost智能指针、内存池初步了解

    本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...

  9. C++11智能指针读书笔记;

    智能指针是一个类对象,而非一个指针对象. 原始指针:通过new建立的*指针 智能指针:通过智能指针关键字(unique_ptr, shared_ptr ,weak_ptr)建立的指针 它的一种通用实现 ...

随机推荐

  1. 洛谷P1265 公路修建(Prim)

    To 洛谷.1265 公路修建 题目描述 某国有n个城市,它们互相之间没有公路相通,因此交通十分不便.为解决这一“行路难”的问题,政府决定修建公路.修建公路的任务由各城市共同完成. 修建工程分若干轮完 ...

  2. IETester是一个免费的Web浏览器调试工具

    功能简介 IETester是一个免费的Web浏览器调试工具,可以模拟出不同的js引擎来帮助程序员设计效果统一的代码.IETester可以在独立的标签页中开启IE5.5.IE6.IE7以及最I新的IE8 ...

  3. [POI2011]Rotacje na drzewie (2)/[BZOJ3702]二叉树

    [POI2011]Rotacje na drzewie (2) 题目大意: 一棵有\(n\)个叶子结点的二叉树,每个叶子结点有一个权值,恰好是\(1\sim n\)的一个排列,你可以任意交换每一对子结 ...

  4. C#种将String类型转换成int型

    API: 有一点是需要注意的,那就是必须保证该String类型内全为数字,能确保转换正确: 1.int.Parse(str); 2.TryParse(str, out intA); 3. Conver ...

  5. IAAS、SAAS 和 PAAS 的区别、理解

    通俗的讲: 如果你是一个网站站长,想要建立一个网站.不采用云服务,你所需要的投入大概是:买服务器,安装服务器软件,编写网站程序.现在你追随潮流,采用流行的云计算,如果你采用IaaS服务,那么意味着你就 ...

  6. ASP.NET 网站管理工具

    ylbtech-Miscellaneos:ASP.NET 网站管理工具 1. 网站管理工具概述返回顶部 网站管理工具概述 介绍 使用网站管理工具,可以通过一个简单的 Web 界面来查看和管理网站配置. ...

  7. Eclipse复制项目彻底修改项目名称

    一.需求 需要新做一个项目,框架还是Maven+SSM,于是就把原来的项目copy了一个,操作是直接选中原项目,CTRL+C ,然后粘贴,这个时候会让你选择工作空间和给一个新的项目名字,如下图,输入新 ...

  8. 基于Python的datetime模块和time模块源码阅读分析

    目录 1 前言  2 datetime.pyi源码分步解析 2.1 头部定义源码分析 2.2 tzinfo类源码分析 2.3 date类源码分析 2.4 time类源码分析 2.5 timedelta ...

  9. 修改PHP上传文件大小设置

    问题: 上传MV到服务器发现有最大文件限制: 50M 怎么修改呢? 度娘了一把, 修改php.ini文件的upload_max_filesize = 100M 及 post_max_size = 10 ...

  10. MySql按周,按月,按日分组统计数据

    知识关键词:DATE_FORMAT select DATE_FORMAT(create_time,'%Y%u') weeks,count(caseid) count from tc_case grou ...