destruktor - sprząta czy nie?

0

Prosty przykład:

class numer
{
	int liczba;
public:
	numer(int n) {liczba=n;}
	~numer(void);
	int zwracaj() {return liczba;}
};
numer nowy(15);
cout << nowy.zwracaj() << endl;
nowy.numer::~numer();
cout << nowy.zwracaj();

Po jawnym wywołaniu destruktora nadal wyświetla na ekranie wartość 15 czyli tak jakby destruktor nie wyczyścił obiektu nowy. O co tu chodzi? Jak dokładnie działa ten destruktor?

0

Destruktora NIE WOŁA się samodzielnie. Stosuje się go kiedy musisz po obiekcie posprzątać. Zmiana wartości pól w klasie z reguły nie należy do zadań destruktora (chociaż istnieją przykłady sytuacji kiedy można by takie coś robić). Poza tym twój destruktor NIE MA CIAŁA, wiec co wg ciebie miałby robić? o_O
Przykład kiedy sie go stosuje:

#include <iostream>
#include <cstring>
using namespace std;

class Person
{
    char* name;
public:
    Person(const char* const n)
    {
        cout<<"tworzenie obiektu i alokacja pamieci"<<endl;
        name=new char[strlen(n)]; //alokujemy pamięć, gdzieś ją trzeba zwolnić jak obiekt będzie niszczony!
        strcpy(name,n);
    }
    ~Person()
    {
        cout<<"kasowanie obiektu i zwalnianie pamieci"<<endl;
        delete[] name; //tak, właśnie tutaj to zwolnimy
    }
};

int main()
{
    Person* ala = new Person("Ala"); //tworzymy obiekt
    delete ala; //niszczymy obiekt, pamięć zostanie zwolniona
    {
        Person ola("Ola"); //tworzymy obiekt
    } //wychodzimy poza zakres, obiekt zostanie zniszczony
    return 0;
}
0
Person* ala = new Person("Ala");

dlaczego po takiej dynamicznej alokacji obiektu typu Person nie można dostać się do jego funkcji składowych? np.:

*ala.funkcja_skladowa();

kompilator na to nie pozwala.

0

Żartujesz ? :>

(*ala).funkcja_skladowa();
albo
ala->funkcja_skladowa();

0

Z czego to drugie rozwiązanie jest dużo lepsze.

0

@lofi odpowiedź jest prosta: bo jesteś leniwy. Jakbyś poświęcił kilka minut na czytanie i myslenie, a nie na spamowanie na forum swoimi problemami to może dowiedziałbyś sie np jaki jest priorytet operatorów i co tak na prawdę oznacza

*ala.funkcja_skladowa();
//i czym się różni od
(*ala).funkcja_skladowa();
0

poza tym po prawidłowym usunięciu obiektu ( czyli nie takim jak ty to robiłeś ) ze zwolnieniem pamięci i wywołaniem ( niejawnym bo tak to robi delete ) destruktora najprawdopodobniej jeśli nie będziesz operował na pamięci to w komórkach pozostaną wartości jakie były przechowywane przez obiekt. Czyli upraszczając nawet jeśli zwolnisz pamięć i zniszczysz obiekt to wartości, które on posiadał i tak pozostają w pamięci do czasu ich ponownego nadpisania. Jednak nie możesz na tym nigdy polegać dlatego powinno się zerować wskaźniki na zwolnione miejsca w pamięci ( bo delete tego niestety nie czyni ) aby przez nieuwagę nie dobierać się do wartości, która tam jest ( i którą oczekujesz ), bo tak naprawdę może jej tam nie być ( ba prędzej czy później na pewno zostanie nadpisana ), powoduje to trudne do wykrycia błędy bo program może ci działać np poprawnie przez 100 uruchomień, a za 101. ci się wykrzaczy i nie będziesz wiedział dlaczego.

1 użytkowników online, w tym zalogowanych: 0, gości: 1