enote笔记法使用范例(2)——指针(1)智能指针

要知道什么是智能指针,首先了解什么称为 “资源分配即初始化”

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所有,抄袭必究。

时间: 2025-01-02 09:20:29

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

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

章节. 编程习惯 why 函数(<<为了>>便于提升软件开发效率和维护效率) 开发角度: 1)隐藏实现细节,这也是API质量最重要的品质2)复用:通过使用函数来代码复用,提高了软件开发效率 3)可维护性:软件更易维护:函数内的代码修改,能够一次改动<<从而>>多处地方自动改动,便于根据需求改动功能或改变算法来提高效率. 4)可读性&可维护性(如果函数可读性差,则会导致因为代码理解困难,进而影响到了可维护性):代码可读性提高:良好命名的函数能通过函数名

指针辨析:悬垂指针、哑指针、野指针、智能指针

悬垂指针: 1:提出的原因: 请看下面的代码片段: [cpp] view plaincopyprint? int *p=NULL; void main() { int i=10;p=&i; cout<<"第一次:*p = "<<*p<<endl; cout<<"第二次:*p = "<<*p<<endl; } [cpp] view plaincopyprint? int *p=NULL;

Boost库中的智能指针 shared_ptr智能指针

shared_ptr智能指针的意思即:boost::shared_ptr是可以智能的管理动态分配的内存资源,几个智能指针可以同时共享一个动态分配的内存的所有权. 下面我们通过一个例子来学习一下它的用法: 注 :使用shared_ptr智能指针,要加入#include <boost/shared_ptr.hpp>头文件 class example { public: ~example() { std::cout <<"It's over\n"; } void do

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

zero 坐在餐桌前,机械的重复“夹菜 -> 咀嚼 -> 吞咽”的动作序列,脸上用无形的大字写着:我心不在焉.在他的对面坐着 Solmyr ,慢条斯理的吃着他那份午餐,维持着他一贯很有修养的形象 ——— 或者按照 zero 这些熟悉他本质的人的说法:假象. “怎么了 zero ?胃口不好么?”,基本填饱肚子之后,Solmyr 觉得似乎应该关心一下他的学徒了. “呃,没什么,只是 …… Solmyr ,C++ 为什么不支持垃圾收集呢?(注:垃圾收集是一种机制,保证动态分配了的内存块会自动释放,J

智能指针的原理和简单实现

什么是智能指针? 智能指针实质上是一个类,定义一个类来封装资源的分配和释放.这个类的构造函数中传入一个指针,完成资源的分配和初始化.在析构函数中释放传入的该指针,完成资源的释放. 为什么要用智能指针? 智能指针就是智能,自动化的管理指针所指向的动态资源. 例如以下情况:代码中经常会忘记释放动态开辟的内存资源,导致内存泄露. // case1 void Test2() {  int* p1 = new int(2);  bool isEnd = true;  //...  if (isEnd)  

C++智能指针简单剖析

导读 最近在补看<C++ Primer Plus>第六版,这的确是本好书,其中关于智能指针的章节解析的非常清晰,一解我以前的多处困惑.C++面试过程中,很多面试官都喜欢问智能指针相关的问题,比如你知道哪些智能指针?shared_ptr的设计原理是什么?如果让你自己设计一个智能指针,你如何完成?等等--.而且在看开源的C++项目时,也能随处看到智能指针的影子.这说明智能指针不仅是面试官爱问的题材,更是非常有实用价值. 下面是我在看智能指针时所做的笔记,希望能够解决你对智能指针的一些困扰. 目录

第十一章:使用智能指针管理对象资源

前言 在前面的文章中,细致地分析了构造函数,拷贝构造函数,赋值运算符,析构函数这几个类中最重要函数的用法. 如果严格地遵循这些做法,可以消除绝大部分资源管理的问题. 然而,要想更灵活的使用对象中的资源,仅仅这些还不够.譬如,若你想自己控制对象资源的生命周期(不要在作用域结束的时候自动被析构掉),那就应当好好考虑下智能指针了. 有人说,智能指针是属于设计模式范畴的产物,这么说有点偏激,但也确实有点道理. 问题分析 我们假定有一个投资类Investment: 1 class Investment 2

C++中智能指针的设计和使用

转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/7561235      智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露.它的一种通用实现技术是 使用引用计数(reference count).智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针.每次创建类的新对象时,初始化指针并将引用计数置为

智能指针简单实现

很多人都误以为智能指针是一个指针,其实不然,智能指针不是指针,智能指针是一个模板,由智能指针实例化出来的的对象具有和常规指针相似的行为,但是他能够自动的释放所指向的对象,所以我们称之为智能指针.如果我们用普通指针来创建一个指向某个对象的指针,那么我们最后必须要手动释放这块空间,而智能指针它是一个类,它释放空间是通过析构函数完成的,正是由于有了这一层封装机制,所以智能指针才能够管理一个对象的生命周期.(定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,在析构函数完成资源的清理,可