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?
  • Path: news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!not
    -for-mail
    From: Tomasz Kaczanowski <kaczus@dowyciecia_poczta.onet.pl>
    Newsgroups: pl.comp.programming
    Subject: Re: [c++]Prosta klasa, czemu nie wywołuje destruktorów?
    Date: Wed, 29 Jul 2009 13:53:33 +0200
    Organization: http://onet.pl
    Lines: 53
    Message-ID: <h4pd81$ds3$1@news.onet.pl>
    References: <h4n80i$97a$1@mx1.internetia.pl>
    <9e35e$4a6f3ab9$506cdd75$4435@news.chello.at>
    <h4nmmm$eh8$1@mx1.internetia.pl>
    NNTP-Posting-Host: aqo162.internetdsl.tpnet.pl
    Mime-Version: 1.0
    Content-Type: text/plain; charset=UTF-8; format=flowed
    Content-Transfer-Encoding: 8bit
    X-Trace: news.onet.pl 1248868417 14211 83.17.174.162 (29 Jul 2009 11:53:37 GMT)
    X-Complaints-To: n...@o...pl
    NNTP-Posting-Date: Wed, 29 Jul 2009 11:53:37 +0000 (UTC)
    User-Agent: Thunderbird 2.0.0.22 (Windows/20090605)
    In-Reply-To: <h4nmmm$eh8$1@mx1.internetia.pl>
    Xref: news-archive.icm.edu.pl pl.comp.programming:182898
    [ ukryj nagłówki ]

    P.K.D pisze:
    > 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:)
    >

    Nie - jest bardzo dobrze - to co jest allokowane przez obiekt, czyścić
    powinien obiekt, jeśli ty allokujesz, to powinieneś ty zwalniać. Jeśli
    byłoby inaczej, nigdy byś nie wiedział, co zwalniać, a co nie i wtedy
    byłby bałagan.

    --
    Kaczus
    http://kaczus.republika.pl

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: