一,以对象管理资源
1,以对象来管理资源
这里有一个类的继承体系,所有的类都继承自Base class。之后创建一个工厂函数,创建特定的Base对象。
Base *create(); //返回指针,指向Base继承体系中动态分配的对象,调用者有责任删除它
为了确保create()返回的资源总是释放,我们需要将资源放到对象里,当对象的生命周期结束时,对象的析构函数会自动释放那些资源。
2,使用auto_ptr智能指针
标准程序库提供的auto_ptr是个类指针对象,也就是所谓的智能指针,其析构函数自动对其所指对象调用delete。使用auto_ptr以避免doSomething()函数潜在的资源泄露。
void doSomething(){
auto_ptr<Base> p(create());
... //使用p,然后由auto_ptr析构函数自动删除p
}
由于auto_ptr销毁时会自动删除其所指的对象,所以一定不能让多个auto_ptr指向同一个对象。如果真是那样,对象会被删除一次以上,而那会导致不明确的行为。为了预防这个问题,auto_ptr有一个不同寻常的性质,若通过copy构造函数或copy assignment运算符复制他们,他们会变成null,而复制所得指针会得到资源的唯一所有权。
auto_ptr<Base> p1(create()); //p1指向对象
auto_ptr<Base> p2(p1); //p2指向对象,p1 = NULL
auto_ptr<Base> p3 = p2; //p3指向对象,p2 = NULL
shared_ptr也是一个智能指针,他能持续追踪有多少指针指向某个资源,并在没有指针指向这个资源时,释放掉这个资源。但是与auto_ptr指针不同的是,shared_ptr指针的复制行为,不会转移所有权。
shared_ptr<Base> p1(create()); //p1指向对象
shared_ptr<Base> p2(p1); //p2指向对象
shared_ptr<Base> p3 = p2; //p3指向对象
注意:
auto_ptr与shared_ptr的析构函数中做的是delete操作而不是delete [] 动作,那就意味着在动态分配而得的array身上使用auto_ptr与shared_ptr是个坏注意。