Effective C++ Chapter3-资源管理

13:以对象管理资源 Use object to manager resources

  • 将资源放进对象内,当控制流离开,该对象会析构函数自动释放那些资源;把资源放进对象内,我们可以依赖C++的析构函数自动调用机制确保资源被释放。
  • RAII “资源获得时机便是初始化时机” “Resource Acquisition Is Initializaton”
  • 例如 可以降资源仿如智能指针 auto_ptr 或 tr1::shared_ptr
  • shared_ptr采用引用计数,多个指针可以指向同一个对象;auto_ptr就不能,只能运行一个指针指向一个对象:如果要指针赋值,那么原来的指针要放弃对该对象的所有权。
  • shared_ptr在最新的c++11中,已经被列入了标准指针,而auto_ptr则出局了。
    shared_ptr采用RAII技术,是防止内存泄露的神器。
# include 
# include 
using namespace std;
class A {
public:
    A() {
        cout << "construct A!!!" << endl;
    }
       ;
    ~A() {
        cout << "destruct A!!!" << endl;
    }
    ;
};
class B: public A {
public:
    B() {
        cout << "construct B!!!" << endl;
    }
    ;
    ~B() {
        cout << "destruct B!!!" << endl;
    }
    ;
};
int main() {
//  B* ptrB0 = new B();
    std::tr1::shared_ptr ptrB1(new B());
}
//输出:
construct A!!!
construct B!!!
destruct B!!!
destruct A!!!

14:在资源管理类中小心copying行为

  • 复制RAII对象必须一并复制它所管理的资源,所以资源的copying行为决定RAII对象的copying行为。
  • 普通而常见的RAII class copying 行为是:抑制copying(例如把它设置为私有)、施行引用计数法。不过其他行为也可能被实现。

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

  • APIs往往要求访问原始资源,所以每一个资源应该提供一个“去的其所管理之资源”的方法。
  • 对原始资源的访问可能经由显示转换或1隐式转换。一般而言显示转换比较安全,但隐式转换比较方便客户。

16:成对使用new 和delete时,采用相同形式。

std::string* stringPtr1 = new std::string;
std::string* stringPtr2 = new std::string[100];
delete stringPtr1; //删除一个对象
delete stringPtr2[ ]; //删除一个由对象组成的数组
typedef std::string AddressLines[4]   //尽量不要这样用
std::string* pal = new AddressLines;
//返回一个string* , 就像“new AddressLines[4]”一个
//上面就必须使用一个数组形式的delete[ ]

17:已独立的语句将newed对象置入智能指针

  • 以独立的语句将新建的对象存储于(置于)智能指针内。如果不这样做,一旦异常被抛出,有可能发生难以察觉的错误。

你可能感兴趣的:(Effective C++ Chapter3-资源管理)