eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programming[c++]Prosta klasa, czemu nie wywołuje destruktorów?Re: [c++]Prosta klasa, czemu nie wywołuje destruktorów?
  • Data: 2009-07-28 20:11:26
    Temat: Re: [c++]Prosta klasa, czemu nie wywołuje destruktorów?
    Od: "P.K.D" <g...@g...com> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    W dniu 2009-07-28 19:52, grg12 pisze:
    > P.K.D pisze:
    >> Tutaj ta klasa: http://paste.dprogramming.com/dpibqklz
    >>
    >> Chodzi o to, że gdy wywołuję server::clearList() to obiekty nie są
    >> niszczone, chyba dlatego, że lista zawiera wskaźniki. Jak to zrobić i
    >> czy da się zrobić tak, że destruktory będą wywoływane automatycznie?
    >
    > Dokładnie dlatego - masz listę wskaźników na obiekty a nie obiektów -
    > wywoływany jest więc "destruktor" wskaźnika :)
    > Możesz np. w metodzie clearList przelecieć po wszystkich elementach
    > zmiennej "servers" i wywołać ich destruktory np. tak:
    >
    > for(std::list<server *>::iterator ii=servers.begin();ii!=servers.end();
    > ii++)
    > {
    > delete (*ii);
    > }
    >
    > servers.clear();
    >
    > Tyle że ciało tej funkcji prawdopodobnie trzeba będzie zdefiniować poza
    > klasą - w tym miejscu gdzie jest teraz destruktor jeszcze nie jest
    > zadeklarowany.
    >
    > I jeszcze jedno - "delete this" w destruktorze to kiepski pomysł (no
    > chyba że się coś w specyfikacji języka zmieniło?). Normalnie wywołanie
    > destruktora jest konsekwencja wywołania delete - destruktor to "ostatnia
    > szansa na posprzątanie zanim system zwolni pamięć" (np. zwolnić pliki,
    > usunąć podobiekty utworzone przez new). W twoim przypadku destruktor
    > może być pusty - jeśli koniecznie chcesz coś tam mieć - wstaw "std::cout
    > << "obiekt typu server o nazwie"<<name<<" właśnie popełnia
    > seppuku"<<std::endl;
    > Pozdrawiam
    > GRG

    Ok, przemyślałem i faktycznie delete this to idiotyzm. Dzięki, że o tym
    wspomniałeś:) W końcu nie miałem wyjścia i zrobiłem swoją funkcję
    clear(), ale myślałem, że może jest jakiś inny sposób przewidziany do
    pracy z takimi listami. No ale niezadowolony jestem, bo chciałbym żeby
    ta lista się sama czyściła. Będę musiał chyba napisać osobną klasę jak
    to Tomasz opisał. Dzięki za odpowiedzi:)

    --
    Life is great, but still... we're all trapped. Each of us is stuck being
    who we are. Sometimes we fight to change ourselves, but ultimately this
    has little effect. We can change what we do, but we cannot change who we
    are.

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: