스마트 포인터sharedptr 구성 요소 사용

shared_ptr는 boost입니다.smart_ptr 라이브러리에서 가장 가치가 있고 무게가 있는 구성 부분입니다.그것과scopedptr는 new 조작부호를 더미에 포장하여 동적 대상을 분배하지만 인용계수(reference-count)형 스마트 지침을 실현하여 자유롭게 복사하고 값을 부여하여 임의의 곳에서 공유할 수 있다.인용 계수 값이 0이고 코드가 없으면 분배된 자원의 대상을 자동으로 삭제합니다.
shared_ptr는 표준 용기에 안전하게 넣고 auto를 보완할 수 있습니다ptr는 의미를 옮기기 때문에 바늘 STL 용기 요소의 결함을 제거할 수 없습니다.C++ 역사상 많은 인용 계수형의 스마트 포인터가 출현했지만 boost::shared 와 비교할 만한 것은 없다ptr의, 과거, 현재, 장래는 모두 가장 좋다.

클래스 요약:

template<class T> class shared_ptr
{
private:

    // Borland 5.5.1 specific workaround
    typedef shared_ptr<T> this_type;

public:

    typedef T element_type;
    typedef T value_type;
    typedef T * pointer;
    typedef typename boost::detail::shared_ptr_traits<T>::reference reference;
    shared_ptr();
    template<class Y>
    explicit shared_ptr( Y * p );
    template<class Y, class D> shared_ptr(Y * p, D d);
    template<class Y, class D, class A> shared_ptr( Y * p, D d, A a );
    template<class Y>
    explicit shared_ptr(weak_ptr<Y> const & r);
    template<class Y>
    shared_ptr( weak_ptr<Y> const & r, boost::detail::sp_nothrow_tag );
    template<class Y>
    shared_ptr( shared_ptr<Y> const & r, typename boost::detail::sp_enable_if_convertible<Y,T>::type = boost::detail::sp_empty() );
    shared_ptr( shared_ptr<Y> const & r );
    template< class Y >
    shared_ptr( shared_ptr<Y> const & r, T * p );
    template<class Y>
    shared_ptr(shared_ptr<Y> const & r, boost::detail::static_cast_tag);
    template<class Y>
    shared_ptr(shared_ptr<Y> const & r, boost::detail::const_cast_tag);
    template<class Y>
    shared_ptr(shared_ptr<Y> const & r, boost::detail::dynamic_cast_tag);
    template<class Y>
    shared_ptr(shared_ptr<Y> const & r, boost::detail::polymorphic_cast_tag);
    template<class Y>
    explicit shared_ptr(std::auto_ptr<Y> & r);
    template<class Ap>
    explicit shared_ptr( Ap r, typename boost::detail::sp_enable_if_auto_ptr<Ap, int>::type = 0 );
    shared_ptr & operator=( shared_ptr const & r ) // never throws
    template<class Y>
    shared_ptr & operator=(shared_ptr<Y> const & r) //never throw
    template<class Y>
    shared_ptr & operator=( std::auto_ptr<Y> & r );
    template<class Ap>
    typename boost::detail::sp_enable_if_auto_ptr< Ap, shared_ptr & >::type operator=( Ap r );
    shared_ptr( shared_ptr && r );
    template<class Y>
    shared_ptr( shared_ptr<Y> && r, typename boost::detail::sp_enable_if_convertible<Y,T>::type = boost::detail::sp_empty() )
    shared_ptr( shared_ptr<Y> && r );
    shared_ptr & operator=( shared_ptr && r ); // never throws
     template<class Y>
    shared_ptr & operator=( shared_ptr<Y> && r ) // never throws
    void reset() ;// never throws in 1.30+
    template<class Y> void reset(Y * p) // Y must be complete
    template<class Y, class D> void reset( Y * p, D d );
    template<class Y, class D, class A> void reset( Y * p, D d, A a );
    template<class Y> void reset( shared_ptr<Y> const & r, T * p );
    reference operator* () const;// never throws
    T * operator-> () const; // never throws
    T * get() const;// never throws
    bool unique() const; // never throws
    long use_count(); const // never throws
    void swap(shared_ptr<T> & other);// never throws
    template<class Y> bool _internal_less(shared_ptr<Y> const & rhs) const;
    void * _internal_get_deleter( boost::detail::sp_typeinfo const & ti );
    bool _internal_equiv( shared_ptr const & r ) const;
private:

    template<class Y> friend class shared_ptr;
    template<class Y> friend class weak_ptr;
    T * px;                     // contained pointer
    boost::detail::shared_count pn;    // reference counter

};  // shared_ptr

shared_ptr는 원시 지침의 행동을 모방하기 위해 *와 -> 조작부호를 다시 불러왔으며, 스텔스 bool 형식 변환을 제공하여 지침이 유효한지 판단합니다.get () 는 원시 바늘을 얻을 수 있으며, 바늘 산술 동작이 제공되지 않습니다.그것은 정상적으로 복사할 수도 있고 값을 부여할 수도 있고sharedptr 간의 비교는 가장 지능적인 지능 지침이다.

shared_ptr에는 여러 가지 형식의 구조 함수가 있는데 여러 가지 가능한 상황에 응용된다.


1,무참sharedptr () 빈 포인터를 가진shared 만들기ptr
2,shared_ptr(Y*p)는 Type Type에 대한 포인터 p의 관리권을 얻으며 참조 수를 1로 설정합니다.이 구조 함수는 T 형식을 Y 형식으로 변환할 수 있어야 합니다
3,shared_ptr(shared ptr const &r) 다른 sharedptr는 바늘의 관리권을 획득하고 인용 계수는 1이고 결과는 두 개sharedptr는 바늘의 관리권을 공유합니다.
4,shared_ptr(std::auto &r)는 auto에서ptr는 포인터의 관리권을 획득하고 인용 계수를 1로 설정하며 autoptr는 자동으로 관리권을 상실합니다.
5,operator=값 부여 조작부호는 다른shared 에서ptr 또는 autoptr는 지침의 관리권을 획득하고 그 행위는 구조 함수와 같다
6,shared_ptr(Y*p, D d) 동작은 shared 와 유사합니다.ptr (Y *p) 이지만 간단한 delete가 아닌 분석 시 사용자 정의 삭제기를 파라미터 d로 지정합니다.
 
shared_ptr의reset () 함수는 인용 계수를 1로 줄이고 바늘 공유를 중지합니다. 인용 계수가 0이 아니면 삭제 작업이 일어나지 않습니다.매개 변수를 가진reset()는 같은 형식의 구조 함수와 유사하며 원 바늘의 인용 계수가 1을 줄이는 동시에 다른 바늘을 관리합니다.
shared_ptr는 인용 계수를 검사하는 두 가지 함수가 있습니다.unique ()는sharedptr가 포인터의 유일한 소유자일 때true로 되돌아오기 (이 동작은 auto ptr 또는scoped ptr와 유사함),usecount () 는 현재 바늘의 인용 계수를 되돌려줍니다.하지만 조심해,usecount () 는 테스트나 디버깅에만 사용되며, 효율적인 조작을 제공하지 않을 뿐만 아니라, 때로는 사용할 수 없을 수도 있습니다.하지만 유니크 ()는 믿음직스러워서 언제든지 사용할 수 있고usecount () = 1 속도가 더 빠릅니다.
shared_ptr는 비교 연산을 지원하여 두 개의shared 를 테스트할 수 있습니다ptr의 상등 또는 불상등은 내부에 저장된 지침을 바탕으로 a.get()==b.get()에 해당한다.operator<크기 비교도 사용할 수 있습니다. 내부에 저장된 바늘을 기반으로 하지만 이외의 비교부호를 제공하지 않아sharedptr는 표준 연관 컨테이너(set 및 map)에 적용될 수 있습니다.
typedef shared_ptr sp_t;
map m;//표준 매핑 컨테이너
sp_t sp(new string("one"));
m[sp] = 111; 
허함수를 기반으로 하는 다중 코드를 작성할 때 바늘의 유형 변환은 매우 유용하다. 예를 들어 하나의 기본 바늘을 하나의 계승 바늘로 변환하거나 반대로 (계승 바늘을 기본 바늘로 변환하는 것).하지만 shared에 대해선ptr는 static 같은 것을 사용할 수 없습니다cast(p.get()의 형식입니다.이로 인해 변형된 포인터가 더 이상 sharedptr가 정확하게 관리합니다.이런 용법을 지원하기 위해sharedptr에서 유사한 변환 함수static 제공pointer_cast() ,const_pointer_cast, dynamic_pointer_cast와 유사하지만 변환된sharedptr.
예를 들어, 다음 코드는dynamic 를 사용합니다.pointer_캐스트 하나를sharedptr하향sharedptr, 그리고staticpointer_cast 리셋을 shared 로 전환ptr;
shared_ptr sp1(new bad_exception("error"));
shared_ptr sp2 = dynamic_pointer_cast(sp1);
shared_ptr sp3 = static_pointer_cast(sp2);
assert(sp3 == sp1);
shared_ptr는 또한 흐르는 출력 조작부호operator<<, 출력 내부의 바늘값을 지원하여 디버깅을 편리하게 합니다.
 
사용 예:
#include <iostream>
#include <boost/smart_ptr.hpp>
using namespace boost;
using namespace std;
class shared //define a custom class
{
 public:
 shared(shared_ptr<int> p):_p(p){}
 void print()
 {
  cout << "count: " << _p.use_count()
       << "  v= " << *_p << endl;
 }
 private:
 shared_ptr<int> _p;
};
void print_func(shared_ptr<int> p)
{
 cout << "count: " << p.use_count() 
      << "  v= " << *p << endl;
}
int main()
{
 /*
 /*example1
 shared_ptr<int> sp(new int(10));//a smart_ptr pointed to int
 assert(sp.unique()); //shared_ptr is the only owner of pointer
 
 shared_ptr<int> sp2 = sp; //the second shared_ptr,copy construct
 assert(sp == sp2 && sp.use_count() == 2); 
 //Two shared_ptr equal, pointing in the same object, reference counting is 2
 *sp2 = 100; //now print *sp2
 assert(*sp == 100);
 sp.reset();//
 assert(!sp);//sp now is empty
 cout << "no problem." << endl;
     */
 /*example2*/
 shared_ptr<int> p(new int(100));
 shared s1(p),s2(p);//custom shared class object
 
 s1.print(); //3
 s2.print();//3
 
 *p = 20; //modify the value of the object which p point to
 print_func(p);//display use_count 4
 s1.print();//3
 
}


 
실행 결과:
count: 3  v= 100 count: 3  v= 100 count: 4  v= 20 count: 3  v= 20
인용 방식으로 매개 변수를 전달하지 않고 직접 복사합니다. 마치 원시 지침을 사용하는 것 같습니다.sharedptr는 이러한 사용법을 지원합니다.
share 를 선언했습니다.ptr와 두 개의 shared 클래스 실례가 있으면 바늘이 공유되기 때문에 인용 계수는 3입니다.print_fun () 함수 내부에shared 복사됨ptr 대상, 따라서 인용 계수가 1 더 증가하고, 종료할 때 복사 자동 분석, 인용 계수가 3 으로 회복됨
 

좋은 웹페이지 즐겨찾기