要知道什么是智能指针,首先了解什么称为 “资源分配即初始化”
what RAII:RAII—Resource Acquisition Is Initialization,即“资源分配即初始化”
在《C++ Primer》这样解释的,“通过定义一个类来封装资源的分配和释放,可以保证正确释放资源”
核心:C++98提供了语言机制:对象(【!值语意对象】)在超出作用域,,析构函数会被自动调用 【如果构造函数中抛出异常,则不会调用析构函数。只有构造函数正确地执行,构建对象成功,才会调用析构函数】
 
《Linux多线程服务端编程》p20:
“我认为RAII是C++语言区别于其他所有编程语言的最重要的特性,一个不懂RAII的程序员不是一格的程序员”个合
“每一个明确的资源配置动作(例如new)都应该在单一语句中执行,并在该语句中立刻将配置获得的资源交给handle对象(如shared_ptr),程序中一般不出现delete”
“shared_ptr是管理共享资源的利器,需要注意避免循环引用,通常的做法是owner持续指向child的shared_ptr,child持有指向owner的weak_ptr”
p15“在现代的C++程序中一般不会出现delete语句,资源(包括复杂对象本身)都是通过对象(智能指针或容器)来管理的,不需要程序员还为此操心”
 
why RAII:1)防止资源泄露(【注意是“资源”,不止是内存】),以及防止其他资源管理问题(比如在内存管理中:野指针,重复释放等问题)
(转刘未鹏blog:如何确保资源一定会被释放(即便发生异常),这在D里面对应的是scope(exit),在Java里面对应的是finally,在C#里面对应的是scoped using。简而言之就是,不管当前作用域以何种方式退出,某某操作(通常是资源释放)都一定要被执行。)
当需要释放的资源有多个的时候,RAII的真正强大之处才被展现出来,一般地说,如果一个函数依次申请N个资源
                       2)异常安全的一部分

why 智能指针内存管理:c++需要程序员手动管理内存,new、delete仍不能保证内存不泄露。并且能一定程度地避免对象状态的破坏,见《effective c++》Item29

when: new和delete之间:

1)return
2)delete在循环中,前面有continue,goto,break
3)异常(代码中抛出异常;调用了抛出异常的函数;嵌套地调用了抛出异常的函数)
 
how:要用new时必须小心翼翼(当然c++的new是个好东西,因为我不愿放弃对系统的控制;不能像c#,java一样毫无顾忌)
           c、c++毕竟只是时代的过渡品。。。
           1)要写new和delete,a)首先要成对编写;其次,b)确保new与delete之间不会出现上述3种情况。
            2)要考虑未来的你,你修改别人的代码,别人修改你的代码。when所以加return,continue,goto,break,或调用函数(只有调用函数就可能抛出异常),都要考虑可能出现资源管理的问题】
 
 
what 智能指针:智能指针是“RAII"技术的实现。
智能指针的核心概念:《Effective C++》给出的关键特点是:
 
1)资源分配立即资源管理对象接管。
2)资源管理对象<<通过>>析构函数来确保正确资源释放
 
《More Effective C++》中这样描述的:“Smart pointers are objects that are designed to look,act,and feel like build-in pointers,but to offer greater functionality.They have a variety of applications, including resource management,以及自动的重复写码工作”
 
智能指针实现上的特点:所有权转移,所有权独占,引用计数
 
《effective c++》p67
what 引用计数
有时候我们希望保有资源,when直到它的最后一个使用者(某对象)被销毁。这种情况下复制RAII对象时,应该将资源的“被引用数”递增。

 
 
以上,版权归作者所有,任何形式转载请联系作者。

--------------------------------------------------------------------------

再发两张截屏的jpg版本:
 
 
 
--------------------------------------------------------------------------
备注:这里的所有内容全部都是我的原创,本文的版权归EverSteins所有,抄袭必究。

enote笔记法使用范例(2)——指针(1)智能指针的更多相关文章

  1. enote笔记法使用范例(1)——自己总结的一些编写代码的常识 (a)

    章节. 编程习惯     why 函数(<<为了>>便于提升软件开发效率和维护效率) 开发角度: 1)隐藏实现细节,这也是API质量最重要的品质2)复用:通过使用函数来代码复用 ...

  2. enote笔记法的思考(ver0.2)

    章节:enote笔记法的思考   enote笔记法,它是一种独特的文本标记方式与呈现方式.这一整套系统的记笔记的方法,它能够帮助我们对文本内容(例如,其中的概念.观点.思想等)更加直观和条理地进行理性 ...

  3. enote笔记法的思考

    章节:enote笔记法的思考   why enote笔记法: key1)大脑喜欢颜色. 我们的大脑天生就喜欢颜色.对颜色很敏感,这是由我们人类过去的演化历程决定的. 你可以理解为,文字有了颜色,让这个 ...

  4. enote笔记法(2)——why的使用

    章节:why的使用 用法: why 概念|词汇(比概念更一般的形式的keyword)|短语|句子 用法1: why 概念|why keyword([比概念更一般的形式的keyword]) “why 概 ...

  5. [转]C++智能指针的创建

    zero 坐在餐桌前,机械的重复“夹菜 -> 咀嚼 -> 吞咽”的动作序列,脸上用无形的大字写着:我心不在焉.在他的对面坐着 Solmyr ,慢条斯理的吃着他那份午餐,维持着他一贯很有修养 ...

  6. c++ 智能指针【转载】

    zero 坐在餐桌前,机械的重复“夹菜 -> 咀嚼 -> 吞咽”的动作序列,脸上用无形的大字写着:我心不在焉.在他的对面坐着 Solmyr ,慢条斯理的吃着他那份午餐,维持着他一贯很有修养 ...

  7. 智能指针shared_ptr的用法

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

  8. c++智能指针实现方式1

    #include<iostream> using namespace std; // 定义仅由HasPtr类使用的U_Ptr类,用于封装使用计数和相关指针 // 这个类的所有成员都是pri ...

  9. C++智能指针简单剖析

    导读 最近在补看<C++ Primer Plus>第六版,这的确是本好书,其中关于智能指针的章节解析的非常清晰,一解我以前的多处困惑.C++面试过程中,很多面试官都喜欢问智能指针相关的问题 ...

随机推荐

  1. ABP源码分析一:整体项目结构及目录

    ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ...

  2. js:给定两个数组,如何判断他们的相对应下标的元素类型是一样的

    题目: 给Array对象原型上添加一个sameStructureAs方法,该方法接收一个任意类型的参数,要求返回当前数组与传入参数数组(假定是)相对应下标的元素类型是否一致. 假设已经写好了Array ...

  3. ASP.NET Core 1.0 使用 Dapper 操作 MySql(包含事务)

    操作 MySql 数据库使用MySql.Data程序包(MySql 开发,其他第三方可能会有些问题). project.json 代码: { "version": "1. ...

  4. 设计模式之行为类模式大PK

                                        行为类模式大PK 行为类模式包括责任链模式.命令模式.解释器模式.迭代器模式.中介者模式.备忘录模式.观察者模式.状态模式.策略 ...

  5. js callee,caller学习

    原文地址:js callee,caller学习 /* * caller 返回一个对函数的引用,该函数调用了当前函数. * 如果函数是由顶层调用的,那么 caller包含的就是 null . * 如果在 ...

  6. WPF 普通属性变化通知

    问题描述:使用ObservableCollection<OrderItem> source 给Datagrid.ItemsSource赋值,在后台更新source集合后,前台Datagri ...

  7. 微软发布VSBT,无需安装Visual Studio即可实现项目编译

    安装了Visual Studio的那些使用微软平台的开发者通常能够非常容易地操作自己的项目:打开解决方案,修改内容,设置好所有必须的文件以及配置后编译项目.但是在构建服务器或者持续交付系统等没有安装V ...

  8. UVa 122 Trees on the level

    题目的意思: 输入很多个节点,包括路径和数值,但是不一定这些全部可以构成一棵树,问题就是判断所给的能否构成一棵树,且没有多余. 网上其他大神已经给出了题目意思:比如我一直很喜欢的小白菜又菜的博客 说一 ...

  9. psoc学习

    第一是:项目的路径需要放在Documents and Settings\,也就是默认的文件夹的地方,不然会报错错误范例为:Question:CY8CKIT-023 kit example projec ...

  10. 微信小程序监控 - HotApp统计

    HotApp小程序统计,第一个专业的微信第三方小程序监控统计工具 1.什么是HotApp小程序统计 HotApp小程序统计是第一个微信第三方小程序统计工具,就像做android 和 ios开发的人知道 ...