Czy destruktor zawsze niszczy obiekt?

Czy destruktor zawsze niszczy obiekt?
K5
  • Rejestracja:około 12 lat
  • Ostatnio:około 7 lat
  • Lokalizacja:Tutaj,obok
  • Postów:759
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.


Jeśli mój post jest dowodem mojej niekompetencji, to trudno, ale po to pytam, żeby się czegoś dowiedzieć.
twonek
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 2 lata
  • Postów:2500
3

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

Pixello
Dlaczego mnie zawsze ktoś wyprzedzi :D?
mwl4
  • Rejestracja:około 12 lat
  • Ostatnio:12 dni
  • Lokalizacja:Wrocław
  • Postów:399
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).


Asm/C/C++
K5
  • Rejestracja:około 12 lat
  • Ostatnio:około 7 lat
  • Lokalizacja:Tutaj,obok
  • Postów:759
0

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

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

i użyje

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

To czy to spowoduje zniszczenie obiektu?


Jeśli mój post jest dowodem mojej niekompetencji, to trudno, ale po to pytam, żeby się czegoś dowiedzieć.
Pixello
  • Rejestracja:około 10 lat
  • Ostatnio:5 miesięcy
  • Lokalizacja:Podkarpacie
  • Postów:448
1

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

twonek
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 2 lata
  • Postów:2500
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.

edytowany 1x, ostatnio: twonek
K5
  • Rejestracja:około 12 lat
  • Ostatnio:około 7 lat
  • Lokalizacja:Tutaj,obok
  • Postów:759
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 ;)


Jeśli mój post jest dowodem mojej niekompetencji, to trudno, ale po to pytam, żeby się czegoś dowiedzieć.
edytowany 1x, ostatnio: kacper546
twonek
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 2 lata
  • Postów:2500
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:

Kopiuj
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.

edytowany 1x, ostatnio: twonek
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 16 godzin
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? ;-)

twonek
Wiedziałem, że ktoś o tym wspomni ;) Raz że to code smell, dwa że mówiłem bardziej do autora.
Azarien
smell czy nie smell, tak działa zliczanie referencji w interfejsach COM. metoda AddRef() zwiększa licznik, Release() zmniejsza i jeśli licznik osiągnął zero to robi delete this;.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.