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

    推荐阅读