Czy destruktor zawsze niszczy obiekt?

0

Mam pytanie. Czy w c++ możliwe jest by destruktor klasy niszczył obiekt tej klasy np jeżeli jest spełniony jakiś warunek?
Tak się zastanawiam jak są zaimplementowane te inteligentne wskaźniki.

3

Destruktor nie niszczy obiektu. Destruktor to metoda, która zawsze jest wywołana tuż przed zniszczeniem obiektu.

0

Kompilator MSVC robi to właśnie w ten sposób. W destruktorze jest argument bool, który określa czy obiekt ma zostać usunięty z pamięci.
Co do inteligentnych wskaźników: implementację możesz podpatrzeć w implementacjach M$ chociażby (cała klasa jest w pliku nagłówkowym ponieważ jest szablon).

0

A czy jeżeli będę miał destruktor w klasie obj zaimplementowany tak:

destruktor()
{///Zakladajac ze a = 665
if(a == 667)destory_object();
)

i użyje

obj object;
delete object ///<- Tu wywoływany jest destruktor.

To czy to spowoduje zniszczenie obiektu?

1

Mylisz jedno z drugim, objekt jest niszczony przez delete, w destruktorze mówisz co ma dodatkowo usunąć PRZED usunięcem obiektu.

4

Ale nie jesteś w stanie napisać funkcji destroy_object() tak, żeby usuwała obiekt w którym jesteś. Nie masz władzy nad tym.
Generalnie celem destruktora nie jest usuwanie obiektu, co często mylnie sądzą początkujący (ja sam tak myślałem). Celem destruktora jest usuwanie zasobów (obiektów, dynamicznej zarezerwowanej pamięci), które posiada ten obiekt.

0

Dzięki za odpowiedzi - mam pewne wątpliwości ale nie wiem jak sformułować pytanie. :( Zobaczę jak są zaimplementowane inteligentne wskaźniki.....
Jak coś (to) napisze ;)

3

Masz tu przykładową implementację shared_ptr, tylko nie wiem czy ta lektura będzie przyjemna: http://svn.boost.org/svn/boost/trunk/boost/smart_ptr/shared_ptr.hpp

Na poziomie koncepcyjnym i mocno upraszczając do przypadku wskaźnika na int, mamy coś takiego:

class shared_ptr
{
public:
    shared_ptr(int* source) : ptr(source) { ++count; }
    shared_ptr(const shared_ptr& rhs) : ptr(rhs.ptr) { ++count; }   // podobnie z operatorem przypisania

    ~shared_ptr() 
    {
        --count;
        if (count == 0)
            delete ptr;
    }

private:
    int* ptr;
    static int count = 0;
};

W destruktorze usuwasz pamięć wskazywaną przez goły wskaźnik ptr, natomiast nie usuwasz samego obiektu klasy shared_ptr.

0
twonek napisał(a):

Ale nie jesteś w stanie napisać funkcji destroy_object() tak, żeby usuwała obiekt w którym jesteś. Nie masz władzy nad tym.

To dlaczego ja widziałem delete this i to w kodzie Microsoftu? ;-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1