`
nathan09
  • 浏览: 144316 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

感悟3:智能指针 = 引用计数 + RAII

 
阅读更多

auto_ptr的一个重要思想是RAII.RAII是"Resource Acquisition Is Initialisation"的简称,有人把它翻译成"资源获取即初始化",但我更喜欢用理解的方式把RAII看成是利用对象的生命周期管理资源。RAII思想不只是局限于C++语言,但毫无疑问它跟C++是绝配。
RAII这一思想,特别是运用在C++语言上,不仅实用、简单,而且高效。把资源的管理交给了特定的资源管理对象,这就把资源的管理局部化在资源管理对象上。资源管理对象主要利用了对象的生命周期达到了自我管理,使得实现极其简单。效率方面,在C++中资源管理对象的所有操作几乎都可以inline化,操作效率丝毫无损。相反,如果不使用RAII,在资源释放的时候可能还会有很多判断语句,不仅代码难看,效率也可能更低。
RAII在C++的使用中,最为引人注目的可能就是auto_ptr了。C++之父在TCPL描述auto_ptr之前,也先介绍了RAII。这也是他在TCPL中的贯用手法--先描述出现某一事物的理由或思想然后再描述事物本身。不过C++之父在描述RAII时,过于关注跟exception的结合使用,可能会使RAII不易引起人的注意。相反Scott Meyers大师却拿着放大镜看RAII,在他的Effective系列中用了好几个条款描述RAII的思想和使用。其间的描述使人兴奋,令人叹服,在描述C++使用RAII方面,应该是无出其右者。
如果把眼界放得更开的话,RAII或许不仅仅用于资源管理,比如可以用资源管理对象来监视资源的获取/释放。根据具体情况需要,或许可能有更多类似的变了形式的使用。怎样使用,那真是美妙之极,古语有云:运用之妙,存乎一心。

有感于auto_ptr背后的一个思想----RAII

分享到:
评论

相关推荐

    raii.js:基于ES6 Promise的RAII堆栈工具

    安装只需通过npm在项目中安装raii.js即可: npm install raii --save快速开始首先,在任何资源初始化之前创建一个raii实例: var Raii = require ( "raii" )var raii = new Raii ( ) ; 然后,将任何资源实例推入raii...

    univalue:高性能RAII C ++ JSON库和通用值对象类

    UniValue是对json_spirit的一种React,旨在最大程度地减少模板和内存使用,提供与链接时优化和嵌入式使用兼容的简单RAII类。 地位 您目前正在查看开发分支-2.45155 。 当前的生产版本可从。 当前的开发系列是1.1.x...

    2. RAII与智能指针1

    RAII与智能指针直接使指针问题忘记 delete 堆内存指针程序异常导致法执 delete 语句// 函数返回堆内存指针// do something, bu

    cppltf:轻量级C ++测试框架

    关于 轻量级C ++测试框架是一个现代的无宏库,旨在测试小型项目。 通过从其自己的头文件...const auto group = test::unit( " raii " , []{ test::unit ( " test::counter " , []{ auto vector = std::vector( 64 );

    C++智能指针的原理和实现.pdf

    C++智能指针的原理和实现 智能指针的原理和实现 ⼀、智能指针起因 ⼀、智能指针起因 在C++中,动态内存的管理是由程序员⾃⼰申请和释放的,⽤⼀对运算符完成:new和delete。 new:在动态内存中为对象分配⼀块空间并...

    cppzmq:libzmq的仅标头C ++绑定

    它提供了RAII样式的类来自动执行资源管理(libzmq C API要求用户注意显式释放资源) cppzmq是轻量级的仅标头绑定。 您只需要包括头文件zmq.hpp(可能还有zmq_addon.hpp)即可使用它。 zmq.hpp旨在包含libzmq C ...

    C++智能指针(1).pdf

    C++智能指针 智能指针 智能指针概念 C/C++ 语⾔最为⼈所诟病的特性之⼀就是存在内存泄露问题,因此后来的⼤多数语⾔都提供了内置内存分配与释放功能,有的甚⾄⼲脆对语 ⾔的使⽤者屏蔽了内存指针这⼀概念。...

    Qt源码剖析-智能指针.pdf

    智能指针是使⽤RAII技术(惯⽤⼿法)对裸指针进⾏封装、隔离、管理。 2. 把堆对象转移为栈对象。 为什么使⽤ 为什么使⽤QT智能 智能(smart)指针? 指针? CPP中在使⽤堆内存时我们必须使⽤指针,使⽤指针给我带来便利...

    C++如何用智能指针管理内存资源

    1.简介 ...智能指针是C++程序员们一件管理内存的利器,使用智能指针管理内存资源,实际上就是将申请的内存资源交由智能指针来管理,是RAII技术的一种实现。RAII是C++的之父Bjarne Stroustrup教授提

    关于c++ 智能指针及 循环引用的问题

    如此c++引入 智能指针 ,智能指针即是C++ RAII的一种应用,可用于动态资源管理,资源即对象的管理策略。 智能指针在 标头文件的 std 命名空间中定义。 它们对 RAII 或 获取资源即初始化 编程惯用法至关重要。 RAII ...

    C++程序的设计机制3 RAII机制

    C++程序的设计机制3 RAII机制

    Jenny:JNI胶水代码生成器

    ) 还有一个额外的好处使用C ++ RAII技术来简化JNI API。 当选择在(与'jenny.useJniHelper'=true ),生成的代理类也将使用add方法jnihelper ,这让生活更快乐!为什么选择珍妮? 在编写JNI代码时,人们通常会遇到...

    xdefer:用于 golang 实用程序的 RAII

    包 xdefer 是 golang 的 RAII 实用程序。 使用关键字 defer 进行清理时,保存的语句总是在周围函数返回后执行。 有时我们需要更精确地控制动作的执行时间。 1.函数返回后执行动作,和原来的defer一样。 func ...

    LMDB嵌入式B +树数据库库的C ++ 11包装器。-C/C++开发

    lmdb ++:LMDB的C ++ 11包装器这是LMDB嵌入式数据库库的综合C ++包装器,提供了经过错误检查的过程接口和具有RAII语义的面向对象的资源接口。 lmdb ++:LMDB的C ++ 11包装器这是LMDB嵌入式数据库库的综合C ++包装器...

    Vulkan包装器

    它添加了诸如RAII之类的C ++概念,并移动了语义以简化Vulkan对象的管理。 当VKW对象超出范围时,它的析构函数将破坏基础的Vulkan对象。 例如: { vk::Instance instance = createInstance (...); // instance ...

    glfwpp:薄型现代C ++ 17标头仅GLFW包装器

    我喜欢C ++和OOP,所以当我找到一个C库时,我立即寻找一个包装器,该包装器提供带有RAII的类而不是免费的create和destroy函数,包装在namespace的标识符,方法(而不是自由函数),作用域的enum (而不是)宏和异常...

    sqlite-cpp:一个简单而强大的C ++ SQLite包装器

    这是因为该库使用RAII和智能指针等C ++功能以内存安全,低开销的方式在后台进行了所有操作。 include include "sqlite_cpp.h" int main() { SQLite::Conn db("database.sqlite"); db.exec("CREATE TABLE ...

    C++11 并发指南之Lock 详解

    std::lock_guard,与 Mutex RAII 相关,方便线程对互斥量上锁。 std::unique_lock,与 Mutex RAII 相关,方便线程对互斥量上锁,但提供了更好的上锁和解锁控制。 另外还提供了几个与锁类型相关的 Tag 类,分别如下...

    Hands-On-System-Programming-with-CPP:Packt发行的《使用C ++进行动手系统编程》

    本书涵盖以下激动人心的功能: 了解使用C ++进行系统编程的好处使用C ++对Linux / Unix系统进行编程发现资源获取即初始化(RAII)的优势编程控制台和文件输入与输出了解POSIX套接字API并了解如何对其进行编程探索...

    raii_with:一个简单的库,可使用raii_with(resource,initializer,destructor){...}语法在符合标准的C99中提供RAII

    一个简单的库,可使用raii_with(resource, initializer, destructor) { ... } -syntax在符合标准的C99中提供RAII(或类似的东西raii_with(resource, initializer, destructor) { ... } : # include " raii/raii.h ...

Global site tag (gtag.js) - Google Analytics