Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Opracował: Piotr DejaVu Szawdyński
Biblioteki C/C++

intrusive_ptr

[szablon klasy] Przechowuje wskaźnik do obiektu, który posiada wbudowany licznik odniesień do obiektu.

Składnia

C/C++
#include <boost/intrusive_ptr.hpp>

template < class T >
class intrusive_ptr
{
    //...
};

Opis szczegółowy

Szablon klasy przechowujący wskaźnik do obiektu, który posiada wbudowany licznik odniesień do obiektu. Każda nowa instancja intrusive_ptr zwiększa licznik odniesień do obiektu poprzez wywołanie funkcji intrusive_ptr_add_ref do której przekazywany jest wskaźnik obiektu poprzez argument. Analogicznie, gdy intrusive_ptr jest niszczony, wywołuje funkcję intrusive_ptr_release. Funkcja intrusive_ptr_release jest odpowiedzialna za niszczenie obiektu gdy licznik odniesień do obiektu wyniesie zero.

Użytkownik musi dostarczyć odpowiednie definicje funkcji intrusive_ptr_add_ref oraz intrusive_ptr_release.

Zastosowanie

Szablon intrusive_ptr ma praktyczne zastosowanie wtedy gdy obiekt może zostać zniszczony przez samego siebie. W pozostałych przypadkach zazwyczaj stosuje się szablon shared_ptr.

Dodatkowe informacje

Niniejsze pojęcie jeszcze nie zostało wyczerpująco przez nas opracowane. Więcej informacji na temat niniejszego hasła znajdziesz pod adresem http://www.boost.org/doc/libs/1_47_0/libs/smart_ptr/intrusive_ptr.html.

Przykład

C/C++
#include <cstdio>
#include <boost/intrusive_ptr.hpp>

class CObiekt
{
public:
    CObiekt()
        : m_iRefCount( 1 )
    {
        printf( "CObiekt()\n" );
    }
    void AddRef()
    {
        m_iRefCount++;
        printf( "AddRef = %d\n", m_iRefCount );
    }
    void Release()
    {
        --m_iRefCount;
        printf( "Release = %d\n", m_iRefCount );
        if( m_iRefCount == 0 )
             delete this;
       
    }
    ~CObiekt()
    {
        printf( "~CObiekt()\n" );
    }
private:
    int m_iRefCount;
};

void intrusive_ptr_add_ref( CObiekt * pObiekt ) { pObiekt->AddRef(); }
void intrusive_ptr_release( CObiekt * pObiekt ) { pObiekt->Release(); }

int main()
{
    boost::intrusive_ptr < CObiekt > pObiekt( new CObiekt );
    printf( "%p\n", pObiekt.get() );
    pObiekt->Release();
    printf( "%p\n", pObiekt.get() );
    pObiekt.reset();
    printf( "%p\n", pObiekt.get() );
    return 0;
}
Standardowe wyjście programu:
CObiekt()
AddRef = 2
00395BD0
Release = 1
00395BD0
Release = 0
~CObiekt()
00000000

Linki zewnętrzne