shared_ptr
析构动作在创建时被捕获,这意味着
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相关推荐
- C++ 智能指针(unique_ptr / shared_ptr)代码实现
文章目录 unique_ptr 智能指针的实现 shared_ptr 智能指针的实现 指针类型转换 unique_ptr 智能指针的实现 一个对象只能被单个unique_ptr 所拥有. #inclu ...
- C++智能指针: shared_ptr 实现详解
文章目录 shared_ptr描述 声明 作用 原理实现 函数使用 关于shared_ptr循环引用问题 shared_ptr描述 声明 shared_ptr属于C++11特性中新加的一种智能指针,它 ...
- 动态内存管理和智能指针 2.0 -- shared_ptr
shared_ptr出现原因 通过第一章的学习,我们知道不管是auto_ptr合适scoped_ptr都是存在缺陷的,于是我们必须想出一个方法既能很好的管理我们的内存,而且在使用的时候,可以多个指针指 ...
- 【Smart_Point】unique_ptr与shared_ptr使用实例
shared_ptr使用实例 文章目录 shared_ptr使用实例 unique_ptr使用实例 cv::fitLine中斜率为正无穷的情况,需要特殊考虑 std::string path = &q ...
- 【Smart_Point】C/C++ 中共享指针 shared_ptr
1. 共享指针 shared_ptr 目录 1. 共享指针 shared_ptr 1.1 共享指针解决的问题? 1.2 创建 shared_ptr 对象 1.3 分离关联的原始指针 1.4 自定义删除 ...
- C++11中shared_ptr的使用
在C++中,动态内存的管理是通过一对运算符来完成的:new,在动态内存中为对象分配空间并返回一个指向该对象的指针,可以选择对对象进行初始化:delete,接受一个动态对象的指针,销毁该对象,并释放与之 ...
- 记录智能指针使用shared_ptr使用错误
shared_ptr为智能指针,今天一次在使用shared_ptr时,错误的将其初始化方式写为shared_ptr<T> test = shared_ptr<T>(),随后导致 ...
- C++ 11 创建和使用 shared_ptr
shared_ptr 的类型是C + +标准库中一个聪明的指针,是为多个拥有者管理内存中对象的生命周期而设计的.在你初始化一个 shared_ptr 后,你可以复制它,把函数参数的值递给它,并把它分配 ...
- C++——智能指针——auto_ptr、shared_ptr、unique_ptr
1.4.智能指针 智能指针是行为类似于指针的类对象. C++11 中提供了三种智能指针,使用这些智能指针时需要引用头文件 : ·shared_ptr; ·unique_ptr; ·auto_ptr; ...
- shared_ptr 的使用及注意事项
1. 声明 #include <boost/shared_ptr.hpp> class UsersBitmap { ... } typedef boost::shared_ptr<U ...
最新文章
- win10服务器权限修改时间,win10系统修改时间显示没权限的解决方案
- 线下活动【西安站】用Leangoo做Scrum敏捷开发实战课(免费)
- VS中查看子类对象内存分布的方法
- 微信小程序知识点梳理
- 一个进程可以创建多少线程?
- UVA 1625 Color Length DP
- 云计算基础知识:CPU虚拟化
- python安装报错类型_Python处理验证码第一篇(pytesser初探及报错处理)
- 高效程序员的 7 项技能
- DataGridView的Cell事件的先后触发顺序
- Spring MVC 基础及相关概念(基础一)
- 在Swift中向数组添加元素
- ASP中常用的服务器检测源代码
- java真题_2017年JAVA考试试题及答案
- linux下各种后缀名文件的压缩和解压缩
- 环境工程学期末复习完整版
- 为什么公司不要大龄程序员
- 可验证随机函数VRF
- 网易企业邮箱在 手机上登陆 总显示密码或账号错误
- 随手记录第二话 -- 高并发情况下秒杀、抢红包都有哪些实现方式?