读书笔记_Effective C++_资源管理

这个章节主要讲的是资源管理相关的知识,C++程序中最常使用的资源就是动态分配内存,但内存只是必须管理的众多资源之一,其他常见的资源还有文件描述器、互斥锁、图形界面的字型和笔刷、数据库连接、以及网络sockets。无论是哪一种资源,重要的是,当你不再使用它时,必须将它还给系统。

条款十三

Investment* createInvestment();     //返回指针,指向Investment继承体系内的动态分配对象,调用者有责任删除它

通常调用这种factory函数,都需要在恰当的时候释放了pInv所指对象。

void f()
{
    Investment* pInv = createInvestment();
    ...
    delete pInv;
}

当很多意外的情况就会导致pInv无法释放,为了确保这一点,需要将资源放进对象中,当控制流离开f,该对象的析构函数会自动释放那些资源(把资源放进对象内,可以依赖C++的析构函数确保资源被释放)。

void f()
{
    std::auto_ptr<Investment> pInv(createInvestment());
    ...
}

以对象管理资源的关键:

(1)获得资源后立刻放进管理对象内;

(2)管理对象运用析构函数确保资源被释放。

auto_ptr被销毁的时候会自动销毁所指的对象,所以应该要注意别让多个auto_ptr同时指向同一个对象。为了预防这个问题,auto_ptrs有一个不寻常的性质:若通过copy构造函数或copy assignment操作符复制它们,它们就会变成null,而复制所得的指针将获得资源的唯一拥有权。

std::auto_ptr<Investment> pInv1(createInvestment());
std::auto_ptr<Investment> pInv2(pInv1); // 现在pInv2指向对象,pIn1被设为null
pInv1 = pInv2;  // 现在pInv1指向对象,pInv2被设为null

受auto_ptrs管理的资源必须绝对没有一个以上的auto_ptr同时指向它,这样的话STL容器就不能存放auto_ptr(STL容器要求其元素发挥正常的复制行为)。

而TR1的tr1::shared_ptr就是个RCSP:

void f()
{
    ...
    std::tr1::shared_ptr<Investment> pInv1(createInvestment());

    std::tr1::shared_ptr<Investment> pInv2(pInv1); // pInv1和pInv2指向同一个对象
    pInv1(pInv2);   // 同理
    pInv1 = pInv2;  // 同理
    ...
}

所以tr1::shared_ptrs可被用于STL容器等语境上。

auto_ptr和tr1::shared_ptr两者都在其析构函数内做delete而不是delete[]动作,意味着动态分配而得的array是无法使用的。一般对于动态分配数组都是使用vector和string,当然使用了Boost程序库的话,可以用boost::scoped_array和boost::shared_array。

持续更新…

时间: 2024-10-17 20:49:09

读书笔记_Effective C++_资源管理的相关文章

读书笔记_Effective C++_习惯C++

这是一本非常经典C++书籍,也是我在工作中发现自己C++上还有很多薄弱点的时候经常拿来充电的.这本书内容很多,讲了很多如何高效地使用C++的方法,有些地方自己也没能啃透,读过一遍后很多知识点容易忘记,这次是一条一条地进行温习,之所以会分享出来是觉得对于程序员来说,好记性不如烂笔头,自己多动手往往在真正写程序的时候能够像条件反射一样写出好的代码.慢工出细活,对待技术要有谨慎和敬畏之心. 这本书推荐喜欢C++的人多读,对文中的一些观点可以自己进行实践,因为内容比较多,所以根据章节进行了划分,笔记中会

读书笔记_Effective C++_构造,析构,赋值

条款五 class Empty { }; 这样的一个类,当C++处理过后,编译器会为它声明一个copy构造函数.一个copy assignment操作符.一个析构函数和一个default构造函数,所有这些函数都是public且inline. class Empty { public: Empty() { ... } Empty(const Empty& rhs) { ... } ~Empty() { ... } Empty& operator=(const Empty& rhs)

读书笔记_Effective C++_条款一:将C++视为一个语言联邦

C++起源于C,最初的名称为C with Classes,意为带类的C语言,然而,随着C++的不断发展和壮大,在很多功能上已经远远超越了C,甚至一些C++程序员反过来看C代码会觉得不习惯. C++可以看成由四个部分组成,分别是: (1) C.C++从语法和代码风格上以C为基础,这也正是C++命名的由来,是在C的基础上++.有意思的是,在<C++ Primer>这本书里有一个问题,问为什么C++叫"C++"而不叫"++C"呢?原因很简单,C++具有深厚的C

《世界是数字的》读书笔记第一部分_硬件篇

http://home.juedui100.com/user/23927142.htmlhttp://home.juedui100.com/user/23822522.htmlhttp://home.juedui100.com/detail/23506643.htmlhttp://home.juedui100.com/user/23506643.htmlhttp://home.juedui100.com/user/23914293.htmlhttp://home.juedui100.com/us

《Effective C++》 读书笔记之三 资源管理

<Effective C++> 读书笔记之三 资源管理 准备知识: 所谓资源就是,一旦用了它,将来必须还给系统.最常用的资源是动态分配内存,其他常见的资源有文件描述器.互斥锁.图形界面的字形和笔刷.数据库连接以及网络sockets. auto_ptr 是个"类指针对象",就是所谓的智能指针,其析构函数自动对其所指对象调用delete.auto_ptr位于 #include <memory> 头文件.由于auto_ptr被销毁时会自动删除它所指之物,所以一定要注意

读书笔记:移动的帝国_日本移动互联网兴衰启示录

新年的时候立了一个旗帜,2017年读30本书,其中包括5本外文原版书.现在4月份了,终于完成一本..主席说,读完一本书,写一写读书笔记会印象更深刻.嗯,实践是对某种认知的最好认识.那就立刻行动起来:) 这本书断断续续阅读,根据微信读书记录,前后共花了5个小时..这5个小时就是实大实在屏幕前阅读的时间,微信阅读的使用感受之一,认识到原来读一本书的时间投入是这么少.碎片化时间果然"害人啊",原来一个下午就可以看完一本书,为什么我们读书还是那么少呢. 那其实这本讲日本移动互联网的书在豆瓣评分

高质量C++/C编程指南_读书笔记1

----------------------------------------------------------------------------- 引用和指针 ----------------------------------------------------------------------------- 以下程序中,n是m的一个引用(reference),m是被引用物(referent). int m; int &n = m; n相当于m的别名(绰号),对n的任何操作就是对m的

《Effective C++》第3章 资源管理(2)-读书笔记

章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(2)-读书笔记 <Effective C++>第3章 资源管理(1)-读书笔记 <Effective C++>第3章 资源管理(2)-读书笔记 <Effective C++>第8章 定制new和delete-读书笔记 条款1

《Effective C++》第3章 资源管理(1)-读书笔记

章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(2)-读书笔记 <Effective C++>第3章 资源管理(1)-读书笔记 <Effective C++>第8章 定制new和delete-读书笔记 内存只是你必须管理的众多资源之一.其他常见的资源还包括文件描述器(file des