关于std:auto_ptr

原创 2007年09月24日 08:24:00

很多人听说过标准auto_ptr智能指针机制,但并不是每个人都天天使用它。这真是个遗憾,因为auto_ptr优雅地解决了C++设计和编码中常见的问题,正确地使用它可以生成健壮的代码。本文阐述了如何正确运用auto_ptr来让你的代码更加安全——以及如何避免对auto_ptr危险但常见的误用,这些误用会引发间断性发作、难以诊断的bug。

1.为什么称它为“自动”指针?
auto_ptr只是众多可能的智能指针之一。许多商业库提供了更复杂的智能指针,用途广泛而令人惊异,从管理引用的数量到提供先进的代理服务。可以把标准C++ auto_ptr看作智能指针的Ford Escort(elmar注:可能指福特的一种适合家居的车型):一个简易、通用的智能指针,它不包含所有的小技巧,不像专用的或高性能的智能指针那么奢华,但是它可以很好的完成许多普遍的工作,它很适合日常性的使用。

auto_ptr所做的事情,就是动态分配对象以及当对象不再需要时自动执行清理。这里是一个简单的代码示例,没有使用auto_ptr所以不安全:
    // 示例 1(a): 原始代码
    //
    void f()
    {
      T* pt( new T );

      /*...更多的代码...*/

      delete pt;
    }

我们大多数人每天写类似的代码。如果f()函数只有三行并且不会有任何意外,这么做可能挺好的。但是如果f()从不执行delete语句,或者是由于过早的返回,或者是由于执行函数体时抛出了异常,那么这个被分配的对象就没有被删除,从而我们产生了一个经典的内存泄漏。

能让示例1(a)安全的简单办法是把指针封装在一个“智能的”类似于指针的对象里,这个对象拥有这个指针并且能在析构时自动删除这个指针所指的对象。因为这个智能指针可以简单的当成一个自动的对象(这就是说,它出了作用域时会自动毁灭),所以很自然的把它称之为“智能”指针:

    // 示例 1(b): 安全代码, 使用了auto_ptr
    //
    void f()
    {
      auto_ptr<T> pt( new T );

      /*...更多的代码...*/

    } // 酷: 当pt出了作用域时析构函数被调用,
      // 从而对象被自动删除

现在代码不会泄漏T类型的对象,不管这个函数是正常退出还是抛出了异常,因为pt的析构函数总是会在出栈时被调用。清理会自动进行。

最后,使用一个auto_ptr就像使用一个内建的指针一样容易,而且如果想要“撤销”资源,重新采用手动的所有权,我们只要调用release():

    // 示例 2: 使用一个 auto_ptr
    //
    void g()
    {
      T* pt1 = new T;
      // 现在,我们有了一个分配好的对象

      // 将所有权传给了一个auto_ptr对象
      auto_ptr<T> pt2( pt1 );

      // 使用auto_ptr就像我们以前使用简单指针一样
      *pt2 = 12;       // 就像 "*pt1 = 12;"
      pt2->SomeFunc(); // 就像 "pt1->SomeFunc();"

      // 用get()来获得指针的值
      assert( pt1 == pt2.get() );

      // 用release()来撤销所有权
      T* pt3 = pt2.release();

      // 自己删除这个对象,因为现在
      // 没有任何auto_ptr拥有这个对象
      delete pt3;

    } // pt2不再拥有任何指针,所以不要
      // 试图删除它...ok,不要重复删除

最后,我们可以使用auto_ptr的reset()函数来重置auto_ptr使之拥有另一个对象。如果这个auto_ptr已经拥有了一个对象,那么,它会先删除已经拥有的对象,因此调用reset()就如同销毁这个auto_ptr,然后新建一个并拥有一个新对象:

    // 示例 3: 使用reset()
    //
    void h()
    {
      auto_ptr<T> pt( new T(1) );

      pt.reset( new T(2) );
        // 删除由"new T(1)"分配出来的第一个T

    } // 最后,pt出了作用域,
      // 第二个T也被删除了 

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

剖析C++标准库智能指针(std::auto_ptr)

剖析C++标准库智能指针(std::auto_ptr) 1.Do you Smart Pointer?       Smart Pointer,中文名:智能指针, 舶来品?     ...

剖析C++标准库智能指针(std::auto_ptr)

剖析C++标准库智能指针(std::auto_ptr) 1.Do you Smart Pointer?       Smart Pointer,中文名:智能指针, 舶来品?       ...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

C++异常安全之std:auto_ptr

auto_ptr是C++标准库中()为了解决资源泄漏的问题提供的一个智能指针类模板(注意:这只是一种简单的智能指针) auto_ptr的实现原理其实就是RAII,在构造的时候获取资源,在析构的时候释放...

智能指针基础std::auto_ptr与new、delete的重载学习笔记

在C/C++中我们malloc/new申请的内存都要自行释放,除非程序结束,否则会造成内存泄漏,这么久以来分配释放已经成为一个习惯,但是有时候还是会有疏漏,忘记释放。而C++中有这么一类东西,它可以替...

STL中的智能指针(Smart Pointer)及其源码剖析: std::auto_ptr

STL中的智能指针(Smart Pointer)及其源码剖析: std::auto_ptr 本文主要介绍了 auto_ptr的使用及其源码。 auto_ptr是STL中的智能指针家族的成员之一, ...

剖析C++标准库智能指针(std::auto_ptr)

1.Do you Smart Pointer?      Smart Pointer,中文名:智能指针, 舶来品?      不可否认,资源泄露(resource leak)曾经是C++程序的一大噩梦...

C++标准库智能指针(std::auto_ptr)

智能指针两大特性: 1.构造栈对象的生命期控制堆上构造的对象的生命期 2.通过release来保证auto_ptr对对象的独权. 另必须使用显示构造 文章结构: 一、剖析C++标准库智能指针...

智能指针 std::auto_ptr 和 shared_ptr

转载:http://blog.sina.com.cn/s/blog_508938e10100f12x.html auto_ptr 类可以用于管理由 new 分配的单个对象,但是无法管理动态分配的...

智能指针std::auto_ptr和tr1:shared_ptr用法(总结的最好的一篇)

下面通过一个工厂函数(createInvestment())返回一个特定的investment对象: Investment* createInvestment();   见如下函数:...

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

1>为防止资源泄漏,请使用RAII对象,它们在构造函数中获得资源并在析构函数中释放资源.如下:void Func(){   Investment* pInv = createInvestment();...
  • mniwc
  • mniwc
  • 2011-03-21 09:56
  • 2816
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)