1. 程式人生 > >c/c++智慧指標總結

c/c++智慧指標總結

  編寫時間: 2018年10月25日12:43:11

  在這裡想說一下,智慧指標的順序是通過我看到原始碼的順序來整理的。

1. boost::scoped_ptr

// 這些程式碼是從別的部落格上摘取下來的
namespace boost
{
    template<typename T> class scoped_ptr : noncopyable
    {
    private:

        T *px;

        scoped_ptr(scoped_ptr const &);
        scoped_ptr &operator=(scoped_ptr const
&); typedef scoped_ptr<T> this_type; void operator==( scoped_ptr const & ) const; void operator!=( scoped_ptr const & ) const; public: explicit scoped_ptr(T *p = 0); ~scoped_ptr(); explicit scoped_ptr( std::auto_ptr<T> p )
: px( p.release() ); void reset(T *p = 0); T &operator*() const; T *operator->() const; T *get() const; void swap(scoped_ptr &b); }; template<typename T> void swap(scoped_ptr<T> &a, scoped_ptr<T> &b); }

    boost::scoped_ptr是一個比較簡單的智慧指標,它能保證在離開作用域之後它所管理物件能被自動釋放。  該智慧指標的特點,不能共享控制權。這是由於該指標將自身的拷貝函式和拷貝建構函式都設定為私有的,這樣在編譯的時候就不能出現共享控制權的行為。此外,由於存在同一個智慧指標會擁有同一個物件,所以在delete的時候就會delete兩次,就好比下面的程式碼。

#include <iostream>
#include <boost/scoped_ptr.hpp>

using namespace std;

int main()
{
  cout << "====Main Begin====" << endl;
  {
    int *ptr = new int(5);
    boost::scoped_ptr<int> myInt1(ptr);
    boost::scoped_ptr<int> myInt2(ptr);
  } 
  cout << "====Main End  ====" << endl;
}

    雖然可以執行,但是結果會顯示段錯誤,這是由於該指標被delete兩次。     雖然如此,但是還是可以交換控制權,比如交換兩個智慧指標的控制權,比如下面的程式碼:

#include <iostream>
#include <boost/scoped_ptr.hpp>

using namespace std;

int main()
{
  cout << "====Main Begin====" << endl;
  {
    boost::scoped_ptr<int> myInt1(new int(5));
    boost::scoped_ptr<int> myInt2(new int(10));

    myInt1.swap(myInt2);

    cout << *myInt1 << endl;
  } 
  cout << "====Main End  ====" << endl;
}