理解shared_ptr<T>】的更多相关文章

1.引用计数字段不能放在资源管理类中.我们的解决办法是,把引用计数和资源绑在一起,进行二次封装.但是这样存在一个大问题,不同类型的资源管理类不能兼容.也就是说,shared_ptr<Dog>不能赋值给shared_ptr<Animal>. 2.你可能会想,使用模版成员方法去解决,但是这里有个问题.因为进行了两次封装,u_ptr的类型还是不一样,也不能赋值.你可能会想,我在u_ptr中也建立模版成员方法,这也是错的.思考下,我们要保证,资源管理类指向同一个u_ptr,对u_ptr进行…
1.shared_ptr<T>解决什么问题? auto_ptr有个局限,拥有权转移.这往往不符合我们的需求,有时候我们期望,多个资源管理对象可以共享一个资源,当引用计数为0的时候,执行delete.shared_ptr就是为了解决这个问题. 2.shared_ptr怎么解决这个问题?和auto_ptr类似,除此之外,还有几点需要注意: 3.增加一个字段为引用计数,当引用计数为0的时候,执行delete.引用计数字段不能放在资源管理类中,为什么? 假设放到资源管理类中,每个资源管理对象都有一个r…
看muduo库某个生产者消费者的地方,利用shared_ptr有效减少了锁的范围及无用的拷贝,下面来看一看 // reader 消费者, shared_ptr<map<string,int> > rd_data ; { MutexLockGuard lock(mutex); 利用局部锁减少锁的粒度 rd_data = _data; } // xxx do stuff rd_data.doSomething(); // writer 生产者 MutexLockGuard lock(m…
在看<Linux多线程服务端编程:使用muduo C++网络库> 的时候,在说到如何防止在将对象的 this 指针作为返回值返回给了调用者时可能会造成的 core dump.需使用 enable_share_from_this. 首先要说明的一个问题是如何安全地将 this 指针返回给调用者.一般来说,我们不能直接将 this 指针返回.想象这样的情况,该函数将 this 指针返回到外部某个变量保存,然后这个对象自身已经析构了,但外部变量并不知道,那么此时如果外部变量使用这个指针,就会使得程序…
线程 线程,有时被称为轻量进程,是程序执行的最小单元. C++11线程: 我们知道平常谈C++线程相关的东东基本都是基于之后要学习的posix相关的,其实在C++11有自己新式创建线程的方法,所以先来看一下,看在C++11中如何来创建一个线的,如下: 比较简单,直接过~ POSIX线程[常用]:POSIX 可移植操作系统接口,标准定义了操作系统应该为应用程序提供的接口标准.相比C++ 11的线程这种方式就要麻烦一些,下面来用看一下它的创建方式: 下面来使用一下: 然后第三个参数则为线程运行的函数…
摘要:本文结合作者的工作经验和学习心得,对C++语言的一些高级特性,做了简单介绍:对一些常见的误解,做了解释澄清:对比较容易犯错的地方,做了归纳总结:希望借此能增进大家对C++语言了解,减少编程出错,提升工作效率. 一.导语 C++是一门被广泛使用的系统级编程语言,更是高性能后端标准开发语言:C++虽功能强大,灵活巧妙,但却属于易学难精的专家型语言,不仅新手难以驾驭,就是老司机也容易掉进各种陷阱. 本文结合作者的工作经验和学习心得,对C++语言的一些高级特性,做了简单介绍:对一些常见的误解,做了…
前言 之前学习muduo网络库的时候,看到作者陈硕用到了enable_shared_from_this和shared_from_this,一直对此概念是一个模糊的认识,隐约记着这个机制是在计数器智能指针传递时才会用到的,今天对该机制进行梳理总结一下吧. 如果不熟悉C++带引用计数的智能指针shared_ptr和weak_ptr,可参考这篇文章:深入掌握智能指针 这篇文章主要介绍C++11提供的智能指针相关的enable_shared_from_this和shared_from_this机制. 问…
本文基于C++标准库源码分析shared_ptr,旨在搞清楚shared_ptr是什么,线程安全性等,目标能够安全的使用智能指针. (一)shared_ptr是一个类. 首先可以确定的是shared_ptr是一个类,那么就可以通过类的内存空间来从本质上分析它的结构. 通过sizeof()一个shared_ptr可以观察到它的大小为8个字节,然后追踪源代码发现它继承一个__shared_ptr类,这个类包含了两个组件:一个指针和一个类. _M_ptr很好理解,就是一个指向你所保护的对象的指针(4字…
前面已经学习过auto_ptr,这里补充另外一种智能指针,比auto_ptr要更强力更通用的shared_ptr. shared_ptr 简介及使用选择  几乎所有的程序都需要某种形式的引用计数智能指针,这种指针让我们不再需要为两个对象或更多对象共享的对象的生命周期而编写复杂的逻辑(写起来有点绕口),当被共享的对象引用计数降为0时,被共享对象被自动析构. 引用计数指针分为插入式(instrusive)和非插入式(non-instrusive)两种.前者要求它所管理的类提供明确的函数或数据成员用于…
最近观看Boost库源代码.Boost功能强大的库,但它的许多源代码,十一细读太费时间,毕竟,还有其他东西要学.所以我决定脱脂感兴趣的章节,他们的设计思路和难以理解的地方记录. shared_ptr是Boost里面最有价值的的智能指针. 它封装了一个原生态指针和一个引用计数器,这个引用计数器是一个类shared_count.shared_ptr支持比較运算,重载了operator<,因此其能够用于set和map. 在转换shared_ptr指针时.用***_pointer_cast定义的函数来转…