std::auto_ptr和tr1::shared_ptr的用法

1>为防止资源泄漏,请使用RAII对象,它们在构造函数中获得资源并在析构函数中释放资源.如下:

void Func()

{

   Investment* pInv = createInvestment();//createInvestment是工厂方法.返回一个堆上的对象指针

   ...;

   delete pInv;

}

这时当在...区域一个过早的return,continue,goto语句退出.这样在区域内的语句抛出异常,这样delete就被忽略过去,这时就发生了内存泄漏,我们泄漏的不只是内含对象的那块内存,还包括那些对象所保存的任何资源.

*为确保createInvestment返回的资源总是被释放,我们需要将资源放进对象内,当控制流离开了Func(),该对象的析构函数会自动释放那些资源.这就是把资源放进对象内.如下:

void Func()

{

   std::auto_ptr<Invesment> pInv(createInvestment()); //auto_ptr"以对象管理资源"

}

 

2>两个常被使用的RAII classes分别是tr1::shared_ptr和auto_ptr.前者是较好的选择,由于auto_ptr被销毁时会自动删除它所指之物,所以一定要注意别让多个auto_ptr同时指向同一个对象,若通过copy构造函数或copy assignment操作符复制它们,它们会变成null,而复制所得的指针将取得资源的唯一拥有权.如下:

void Func1()

{

  std::auto_ptr<Investment> pInv1(createInvestment());//pInv1指向工厂函数createInvestment返回物

  std::auto_ptr<Investment> pInv2(pInv1);             //现在pInv2指向上述对象,但pInv1被设为null了

  pInv1 = pInv2;                                   //现在pInv1指向上述对象了.pInv2被设为null了

}

但tr1::shared_ptr却可以保证多个对象指向同一笔资源,并在无人指向它时自动删除该资源.如下

void Func1()

{

   std::tr1::shared_ptr<Investment> pInv1(createInvestment());//pInv1指向crateInvestment返回物

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

   pInv1 = pInv2;  //同上,无任何改变

}//函数结束后,pInv1和pInv2被销毁,它们所指的对象也被自动销毁

 

 

*auto_ptr在头文件<memory>中

*shared_ptr在boost的头文件模块中.在vs最新的编译器己可用.但在vc6上却找不到该模块.

 

 

 

注:本文转自http://blog.sina.com.cn/s/blog_5fa144950100knsz.html#

 

 

 

 

 

因为auto_ptr并不是完美无缺的,它的确很方便,但也有缺陷,在使用时要注意避免。首先,不要将auto_ptr对象作为STL容器的元素。C++标准明确禁止这样做,否则可能会碰到不可预见的结果

auto_ptr的另一个缺陷是将数组作为auto_ptr的参数: auto_ptr<char>  pstr (new char[12] ); //数组;为定义
然后释放资源的时候不知道到底是利用delete pstr,还是 delete[] pstr;

然后收集了关于auto_ptr的几种注意事项:
1、auto_ptr不能共享所有权。
2、auto_ptr不能指向数组
3、auto_ptr不能作为容器的成员。
4、不能通过赋值操作来初始化auto_ptr
std::auto_ptr<int> p(new int(42));     //OK
std::auto_ptr<int> p = new int(42);    //ERROR
这是因为auto_ptr 的构造函数被定义为了explicit
5、不要把auto_ptr放入容器

然后笔者从而推荐的是boost的shared_ptr,然后看完shared_ptr关于智能指针的介绍与例子。
5种针对auto_ptr不足的指针如下:需要详细了解可以去查看相当文档,与测试新代码。

scoped_ptr <boost/scoped_ptr.hpp> 简单的单一对象的唯一所有权。不可拷贝。
scoped_array <boost/scoped_array.hpp> 简单的数组的唯一所有权。不可拷贝。
shared_ptr <boost/shared_ptr.hpp> 在多个指针间共享的对象所有权。
shared_array <boost/shared_array.hpp> 在多个指针间共享的数组所有权。
weak_ptr <boost/weak_ptr.hpp> 一个属于 shared_ptr 的对象的无所有权的观察者。
intrusive_ptr <boost/intrusive_ptr.hpp> 带有一个侵入式引用计数的对象的共享所有权。

1. shared_ptr是Boost库所提供的一个智能指针的实现,shared_ptr就是为了解决auto_ptr在对象所有权上的局限性(auto_ptr是独占的),在使用引用计数的机制上提供了可以共享所有权的智能指针.
2. shared_ptr比auto_ptr更安全
3. shared_ptr是可以拷贝和赋值的,拷贝行为也是等价的,并且可以被比较,这意味这它可被放入标准库的一般容器(vector,list)和关联容器中(map)。

关于shared_ptr的使用其实和auto_ptr差不多,只是实现上有差别,关于shared_ptr的定义就不贴代码了,以为内开源,可以网上找
1、shared_ptr<T> p(new Y);


要了解更多关于auto_ptr的信息,可以查看more effective c++ 的p158页条款28
要了解shared_ptr 类模板信息,可以查看boost 1.37.0中文文档,而且支持数组的shared_array 类模板

你可能感兴趣的:(vector,null,delete,文档,编译器,RAII)