• 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++

Object Storage Arubacloud
0 głosów
333 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 Ekspert (344,860 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 (212,670 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 135 wizyt
pytanie zadane 4 czerwca 2017 w C i C++ przez Eryk Chojnacki Obywatel (1,420 p.)
0 głosów
1 odpowiedź 455 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...