析构动作在创建时被捕获,这意味着

1. 虚析构不再是必须。

2. shared_ptr<void> 可以持有任何对象而且能够安全释放。比如

#include<iostream>
#include<memory>
using namespace std;
class base : public enable_shared_from_this<base> {
public:base(int n = 0) :x(n) {}int x;virtual void print(){cout << "self_shared:" << x << endl;}~base() {cout << "this is base class" << endl;}
};class derive :public base {
public:virtual void print(){cout << "derive" << endl;}~derive(){cout << "this is derive class" << endl;}
};void test(const shared_ptr<base>& value1, const shared_ptr<base>& value2) {value1->print();value2->print();
}int main()
{shared_ptr<base> p1 = shared_ptr<derive>(new derive());p1->print();//shared_ptr<base> p1 = shared_ptr<base>(new base(22));//p1->print();//shared_ptr<base> sp = make_shared<base>(111);//sp->print();//test(make_shared<base>(1), make_shared<base>(2));return 0;
}

输出

derive
this is derive class
this is base class

share_from_this()可以方便在类的内部获得自己的shared_ptr,比如以下代码:

class Stock {string key_;
public:Stock(const string& k):key_(k){}const string& key(){return key_;}};class StockFactory: public enable_shared_from_this<StockFactory> {map <string, weak_ptr<Stock>> stocks_;
public:StockFactory() {cout << "the StockFactory is create" << endl;}~StockFactory() {cout << "destory StockFactory!!!!" << endl;}shared_ptr<Stock> get(const string& key) {shared_ptr<Stock> pStock;weak_ptr<Stock>& wkStock = stocks_[key];pStock = wkStock.lock();if (!pStock) {pStock.reset(new Stock(key), std::bind(&StockFactory::deleteStock, shared_from_this(), std::placeholders::_1));wkStock = pStock;}return pStock;}private:void deleteStock(Stock* stock) {if (stock) {            cout << "deleteStock" << endl;stocks_.erase(stock->key());}delete stock;}
};int main()
{shared_ptr<Stock> p2;    {shared_ptr<StockFactory> p1 = make_shared<StockFactory>();p2 = p1->get("google");cout << p1.use_count() << endl;}return 0;
}

pStock.reset(new Stock(key), std::bind(&StockFactory::deleteStock, shared_from_this(), std::placeholders::_1));

如果在这一句中用this代替shared_from_this(),则最后智能指针p2的释放会出问题。因为p1已经销毁了,this指针是一个非法指针。但用shared_from_this(),这个指针所指对象的生命周期就和函数对象有关。

转载于:https://www.cnblogs.com/vaecn/p/8045985.html

shared_ptr相关推荐

  1. C++ 智能指针(unique_ptr / shared_ptr)代码实现

    文章目录 unique_ptr 智能指针的实现 shared_ptr 智能指针的实现 指针类型转换 unique_ptr 智能指针的实现 一个对象只能被单个unique_ptr 所拥有. #inclu ...

  2. C++智能指针: shared_ptr 实现详解

    文章目录 shared_ptr描述 声明 作用 原理实现 函数使用 关于shared_ptr循环引用问题 shared_ptr描述 声明 shared_ptr属于C++11特性中新加的一种智能指针,它 ...

  3. 动态内存管理和智能指针 2.0 -- shared_ptr

    shared_ptr出现原因 通过第一章的学习,我们知道不管是auto_ptr合适scoped_ptr都是存在缺陷的,于是我们必须想出一个方法既能很好的管理我们的内存,而且在使用的时候,可以多个指针指 ...

  4. 【Smart_Point】unique_ptr与shared_ptr使用实例

    shared_ptr使用实例 文章目录 shared_ptr使用实例 unique_ptr使用实例 cv::fitLine中斜率为正无穷的情况,需要特殊考虑 std::string path = &q ...

  5. 【Smart_Point】C/C++ 中共享指针 shared_ptr

    1. 共享指针 shared_ptr 目录 1. 共享指针 shared_ptr 1.1 共享指针解决的问题? 1.2 创建 shared_ptr 对象 1.3 分离关联的原始指针 1.4 自定义删除 ...

  6. C++11中shared_ptr的使用

    在C++中,动态内存的管理是通过一对运算符来完成的:new,在动态内存中为对象分配空间并返回一个指向该对象的指针,可以选择对对象进行初始化:delete,接受一个动态对象的指针,销毁该对象,并释放与之 ...

  7. 记录智能指针使用shared_ptr使用错误

    shared_ptr为智能指针,今天一次在使用shared_ptr时,错误的将其初始化方式写为shared_ptr<T> test = shared_ptr<T>(),随后导致 ...

  8. C++ 11 创建和使用 shared_ptr

    shared_ptr 的类型是C + +标准库中一个聪明的指针,是为多个拥有者管理内存中对象的生命周期而设计的.在你初始化一个 shared_ptr 后,你可以复制它,把函数参数的值递给它,并把它分配 ...

  9. C++——智能指针——auto_ptr、shared_ptr、unique_ptr

    1.4.智能指针 智能指针是行为类似于指针的类对象. C++11 中提供了三种智能指针,使用这些智能指针时需要引用头文件 : ·shared_ptr; ·unique_ptr; ·auto_ptr; ...

  10. shared_ptr 的使用及注意事项

    1. 声明 #include <boost/shared_ptr.hpp> class UsersBitmap { ... } typedef boost::shared_ptr<U ...

最新文章

  1. win10服务器权限修改时间,win10系统修改时间显示没权限的解决方案
  2. 线下活动【西安站】用Leangoo做Scrum敏捷开发实战课(免费)
  3. VS中查看子类对象内存分布的方法
  4. 微信小程序知识点梳理
  5. 一个进程可以创建多少线程?
  6. UVA 1625 Color Length DP
  7. 云计算基础知识:CPU虚拟化
  8. python安装报错类型_Python处理验证码第一篇(pytesser初探及报错处理)
  9. 高效程序员的 7 项技能
  10. DataGridView的Cell事件的先后触发顺序
  11. Spring MVC 基础及相关概念(基础一)
  12. 在Swift中向数组添加元素
  13. ASP中常用的服务器检测源代码
  14. java真题_2017年JAVA考试试题及答案
  15. linux下各种后缀名文件的压缩和解压缩
  16. 环境工程学期末复习完整版
  17. 为什么公司不要大龄程序员
  18. 可验证随机函数VRF
  19. 网易企业邮箱在 手机上登陆 总显示密码或账号错误
  20. 随手记录第二话 -- 高并发情况下秒杀、抢红包都有哪些实现方式?

热门文章

  1. 【ESP32】【乐鑫发布 AI 语音麦克风阵列开发板 ESP32-Korvo】
  2. 诚之和:Python数据科学使用numpy求行均值
  3. java之MySQL事务处理
  4. 拖延症究竟是个什么东西?
  5. 520送对象什么礼物最好?精选4款好用的电容笔
  6. GameFramework篇:前言
  7. pytorch中的MSELoss函数
  8. 企业微信怎么扫描名片加好友?企业微信名片如何统计好友添加情况?
  9. [机器学习笔记] 用Python分析:红葡萄酒质量分析(数据探索)
  10. python设计石头剪刀布游戏_用python制作剪刀石头布游戏