effective c++第三篇

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liunan199481/article/details/82020771

资源管理

资源概述

  • c++中最常见的资源就是内存资源,管理不好内存资源容易造成内存泄漏。
  • 其它常见资源有:**文件描述器、互斥锁、图形界面中的字体和笔刷、数据库链接、网络socket等。

条款13:用对象管理资源

  • 首先先理解几个常识:
    1. c++中普通的对象是存放在栈中的,当对象离开作用域,对象析构函数被调用
    2. c++中new出来的对象是放在堆上的,如果不适用delete,它不会自动调用析构函数
    3. 鉴于以上2点,我们又得出结论:若一个对象中有指针成员,指针指向的对象是new出来的,我们要在它的析构函数内delete掉指针成员指向的对象;对于这个对象,若它是类直接实例化的,参考1;若它是new出来的,参考2.
  • 书中的使用对象来管理资源也就大概是这个意思。
  • 为了实现程序自动管理资源,数组推荐智能指针,因为它可以自动delete。
  • 由于delete的特性,所以不能有2个智能指针指向同一个对象,因为会delete掉2次。
  • auto_ptr=>智能指针,但是它不支持指针指针间的赋值,赋值之后赋值的指针会变成null,被赋值者指向原来对象,但是这刚好保证了,赋值不会产生2个指针指向一个对象,但是如果让2个智能指针指向同一个对象还是可以的。
  • shared_ptr=>比auto_ptr高级一点,基于引用次数实现的(RCSP),指针间赋值和auto_ptr不一样。
  • 总结:
    • 使用RAII对象进行资源管理,在构造函数中申请资源,在析构中释放资源。
    • 常见的RAII CLASSES有:auto_ptr和shared_ptr,后者copy行为更直观,推荐使用后者。

条款14:在资源管理类中,小心copy行为

  • copy RAII对象,连其管理的资源一起copy
  • 常见的RAII classes coping行为有:抑制coping、施行引用计数法

条款15:在资源管理类中提供对原始资源的访问

  • 不用担心,shared_ptr和auto_ptr都有一个get函数,可以返回内部的原始指针。这是显式转换
  • shared_ptr和auto_ptr重载了operator->和operator*,所以他们也具有隐式转换。
  • 自己设计RAII CLASS需要遵循的原则:
    • 提供访问原始资源的办法
    • 对原始资源的访问可以使用显示转换和隐式转换。

条款16:new和delete使用相同形式

new delete
new [] delete[]

条款17:以独立语句将new出的对象置于智能指针中

  • 不能在符合语句中,进行上面的操作,比如,不能再函数调用中将new的对象存储于智能指针中,有异常,可能造成内存泄漏。

effective c++第二篇

猜你喜欢

转载自blog.csdn.net/liunan199481/article/details/82020771