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!newsfeed.gazeta.pl!feed.news.interia.pl!news.nask.pl!ne
    ws.nask.org.pl!newsfeed00.sul.t-online.de!newsfeed01.sul.t-online.de!t-online.d
    e!newsfeed01.chello.at!newsfeed02.chello.at!news.chello.at.POSTED!not-for-mail
    Date: Tue, 28 Jul 2009 19:52:03 +0200
    From: grg12 <g...@c...at>
    User-Agent: Thunderbird 2.0.0.22 (Windows/20090605)
    MIME-Version: 1.0
    Newsgroups: pl.comp.programming
    Subject: Re: [c++]Prosta klasa, czemu nie wywołuje destruktorów?
    References: <h4n80i$97a$1@mx1.internetia.pl>
    In-Reply-To: <h4n80i$97a$1@mx1.internetia.pl>
    Content-Type: text/plain; charset=UTF-8; format=flowed
    Content-Transfer-Encoding: 8bit
    X-Antivirus: avast! (VPS 090727-0, 2009-07-27), Outbound message
    X-Antivirus-Status: Clean
    Message-ID: <9e35e$4a6f3ab9$506cdd75$4435@news.chello.at>
    X-Complaints-To: a...@c...at
    Organization: chello.at
    Lines: 34
    NNTP-Posting-Host: 80.108.221.117 (80.108.221.117)
    NNTP-Posting-Date: Tue, 28 Jul 2009 19:51:53 +0200
    X-Trace: 9e35e4a6f3ab9f5c978d004435
    Xref: news-archive.icm.edu.pl pl.comp.programming:182876
    [ ukryj nagłówki ]

    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

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: