首页 技术 正文
技术 2022年11月12日
0 收藏 912 点赞 3,026 浏览 1957 个字

要知道什么是智能指针,首先了解什么称为 “资源分配即初始化”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)return2)delete在循环中,前面有continue,goto,break3)异常(代码中抛出异常;调用了抛出异常的函数;嵌套地调用了抛出异常的函数) 【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++》p67what 引用计数:有时候我们希望保有资源,when直到它的最后一个使用者(某对象)被销毁。这种情况下复制RAII对象时,应该将资源的“被引用数”递增。

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

————————————————————————–

再发两张截屏的jpg版本: enote笔记法使用范例(2)——指针(1)智能指针enote笔记法使用范例(2)——指针(1)智能指针  ————————————————————————–
备注:这里的所有内容全部都是我的原创,本文的版权归EverSteins所有,抄袭必究。

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,492
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,907
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,740
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,495
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,132
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,297