c/c++智慧指標總結
阿新 • • 發佈:2018-12-17
編寫時間: 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;
}