• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Sens destruktorów w c++

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
371 wizyt
pytanie zadane 3 kwietnia 2018 w C i C++ przez pewien_programista Obywatel (1,070 p.)
zamknięte 3 kwietnia 2018 przez pewien_programista
Witam! Jestem raczej początkującym w dziedzinie programowania (trochę umiem ale mam jeszcze dużo do nauczenia) i zastanawia mnie jedna rzecz dotycząca programowania obiektowego. O ile jak najbardziej rozumiem cały mechanizm działania konstruktorów, to jest coś co nurtuje mnie jeśli chodzi o destruktory - mianowicie czy są one bardzo istotne. To znaczy, rozumiem, że pozwalają zwolnić pamięć, ale gdzieś wyczytałem, że po usunięciu obiektu klasy jest ona zwalniana automatycznie. Stąd moje pytanie - czy używanie destruktorów jest bardzo istotne (pomijając sytuacje gdzie chcemy po usunięciu obiektu zrobić coś więcej niż zwolnienie pamięci), czy może jest to tylko dobra praktyka, która wywodzi się z dawniejszych czasów c++? Z góry dziękuję za odpowiedź :)
komentarz zamknięcia: Dziękuję za odpowiedź :)

2 odpowiedzi

+4 głosów
odpowiedź 3 kwietnia 2018 przez adrian17 Mentor (351,140 p.)
wybrane 3 kwietnia 2018 przez pewien_programista
 
Najlepsza

To znaczy, rozumiem, że pozwalają zwolnić pamięć, ale gdzieś wyczytałem, że po usunięciu obiektu klasy jest ona zwalniana automatycznie

Tylko jeśli obiekt jest na stosie. Jeśli masz np wskaźnik do pamięci na stercie, program sam z nim nic nie robi:

{
    int *x = new int;
} // wyciek pamieci

Na przykład jeśli masz std::string, który w uproszczeniu wygląda tak:

class string {
    size_t length;
    char *data;
    // metody
};

Zadaniem destruktora std::string jest zapewnienie, że pamięć `data` zostanie automatycznie zwolniona. Dzięki temu nie musisz pisać:

void f(){
    std::string s;
    // cos robisz ze stringiem
    delete s.data;
}

Tylko wystarczy:

void f(){
    std::string s;
    // cos robisz ze stringiem
} // destruktor zwalnia pamięć

Analogicznie dla np otwartych plików. Bez destruktorów musiałbyś zawsze się pilnować i pisać:

void f(){
	ifstream f("dane.txt");
	if (warunek) {
		f.close(); // trzeba zamknac plik przed wyjsciem!
		return;
	}

	try {
		cos_co_moze_rzucic_wyjatkiem();
	} catch (std::exception &e) {
		f.close(); // trzeba zamknac plik!
		return;
	}
	costam();
	f.close(); // trzeba zamknac plik przed wyjsciem!
}

Ale destruktor zamknie plik za Ciebie. Do tego, destruktory mają potężną właściwość, że dla obiektów automatycznych praktycznie zawsze się wywołują - nie musisz się przejmować if'ami, wczesnymi returnami, wyjątkami.

void f(){
    ifstream f("dane.txt");
    if (warunek)
        return;

    cos_co_moze_rzucic_wyjatkiem();
    costam();
} // masz gwarancje ze `f.close()` sie wywola

czy może jest to tylko dobra praktyka, która wywodzi się z dawniejszych czasów c++?

Destruktory (i RAII) to kluczowy, jeśli nie najważniejszy, ficzer C++a. Ich ważność tylko rośnie z czasem.

0 głosów
odpowiedź 3 kwietnia 2018 przez Ehlert Ekspert (214,530 p.)

C++ jest językiem, który umożliwia dostęp do pamięci. Można ją rezerwować statycznie(stos), czyli dla zmiennych lokalnych, lub dynamicznie(sterty), czyli dla zasobów tworzonych np poprzez new.

Kiedy w klasie masz same zmienne statyczne, to luzik. Destruktor nie jest istotny. I tak zostanie utworzony, bo kompilator "dopisze" sobie domyślny.

Jednak w sytuacji kiedy składowymi klasy są zasoby dynamiczne, np tablice, to w destruktorze wypada je usunąć, czyli zwolnić po nich pamięć. Warto zauważyć że posiadanie wskaźnika w klasie nie wymusza w zadnym wypadku użycia delete. Wszystko zależy od kontekstu i zakresu danych. 

Podobne pytania

0 głosów
2 odpowiedzi 175 wizyt
pytanie zadane 4 czerwca 2017 w C i C++ przez Eryk Chojnacki Obywatel (1,420 p.)
0 głosów
1 odpowiedź 509 wizyt

93,188 zapytań

142,204 odpowiedzi

322,027 komentarzy

62,515 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 2581p. - dia-Chann
  2. 2537p. - Łukasz Piwowar
  3. 2528p. - Łukasz Eckert
  4. 2514p. - CC PL
  5. 2476p. - Tomasz Bielak
  6. 2445p. - Łukasz Siedlecki
  7. 2443p. - rucin93
  8. 2418p. - Michal Drewniak
  9. 2373p. - Marcin Putra
  10. 2367p. - Adrian Wieprzkowicz
  11. 2317p. - Mikbac
  12. 2156p. - Anonim 3619784
  13. 2016p. - Michał Telesz
  14. 1733p. - rafalszastok
  15. 1628p. - Dominik Łempicki (kapitan)
Szczegóły i pełne wyniki

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...