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

auto_ptr

[szablon klasy] Przechowuje wskaźnik na zaalokowany obiekt zapewniając jednocześnie jego zwolnienie z chwilą wywołania destruktora.

Składnia

C/C++
#include <memory>

namespace std
{
   
    template < class Type >
    class auto_ptr
    {
    };
   
}

Parametry szablonu

ParametrOpis
class TypeOkreśla typ obiektu, który jest alokowany bądź zwalniany.

Opis szczegółowy

Przechowuje wskaźnik na zaalokowany obiekt zapewniając jednocześnie jego zwolnienie z chwilą wywołania destruktora. Typ wskaźnika określa parametr szablonu. Adres przechowywany przez wskaźnik musi wynosić NULL lub być poprawnie zaalokowanym wskaźnikiem na obiekt, któremu pamięć została przydzielona przy pomocy operatora new.

Należy pamiętać, że obiekt std::auto_ptr zachowuje się tak jakby był on właścicielem dynamicznie zaalokowanego obiektu, a więc zwolni on dynamicznie zaalokowany obszar pamięci z chwilą wywołania destruktora lub metody reset.

W przypadku wykonania operacji przypisania bądź wywołania konstruktora kopiującego, obiekt źródłowy przekazuje prawo własności do obiektu docelowego. Przetransferowany wskaźnik zostanie ustawiony na wartość NULL w obiekcie źródłowym. Jeżeli w obiekcie docelowym istniał zaalokowany dynamicznie obiekt to zostanie on automatycznie zwolniony zanim nastąpi operacja przypisania.

Uwaga!
Nie należy tworzyć kilku obiektów std::auto_ptr, które przejmują prawo własności do tego samego obiektu.

Przykład

C/C++
#include <cstdio>
#include <memory>

class CDane
{
public:
    CDane( int x )
        : m_x( x )
    { printf( "CDane(%d)\n", m_x ); }
    ~CDane() { printf( "~CDane(%d)\n", m_x ); }
   
    const int & dajX() const { return m_x; }
private:
    int m_x;
};

typedef CDane TypDanych;

void wypisz( const char * sOpis, const std::auto_ptr < TypDanych >& p )
{
    if( p.get() )
         printf( "%s = 0x%p | wartosc = %d\n", sOpis, p.get(), p->dajX() );
    else
         printf( "%s = 0x%p | NULL\n", sOpis, p.get() );
   
}
int main()
{
    std::auto_ptr < TypDanych > p1( new TypDanych( 5 ) );
    std::auto_ptr < TypDanych > p2;
    wypisz( "p1", p1 );
    wypisz( "p2", p2 );
    printf( "p2 = p1\n" );
    p2 = p1;
    wypisz( "p1", p1 );
    wypisz( "p2", p2 );
    printf( "p2 = p1\n" );
    p2 = p1;
    wypisz( "p1", p1 );
    wypisz( "p2", p2 );
    return 0;
}
Standardowe wyjście programu:
CDane(5)
p1 = 0x005b0f18 | wartosc = 5
p2 = 0x00000000 | NULL
p2 = p1
p1 = 0x00000000 | NULL
p2 = 0x005b0f18 | wartosc = 5
p2 = p1
~CDane(5)
p1 = 0x00000000 | NULL
p2 = 0x00000000 | NULL

Linki zewnętrzne