Czy własny konstruktor wymaga własnego destruktora?

0

Witam,

Czy jest to zasadą, że każde napisanie własnego konstruktora wymaga napisania destruktora, który robi po nim porządek? Co powinno znaleźć się w takim destruktorze, np. jeśli w konstruktorze przypisuję atrybutom klasy pewne wartości (podane jako parametry)?

0

Jeśli alokujesz gdzieś pamięć to destruktor powinien ją zwolnić.

0

Ale pamiętam, że była taka sytuacja, że miałem klasę student i konstruktor wyglądał mniej więcej tak:

Student(string n, string s) {
this->name = n;
this->surname = s;
};

I wykładowca powiedział, że jeżeli mam taki konstruktor i obiekty tworzę w ten sposób:

Student* student1 = new Student("Imię", "Nazwisko");

To że powinienem mieć destruktor, który po tym posprząta. Czy to prawda? Jak powinien on wyglądać?

0
Bent napisał(a):

Czy jest to zasadą, że każde napisanie własnego konstruktora wymaga napisania destruktora, który robi po nim porządek?
Nie.

Bent napisał(a):

Co powinno znaleźć się w takim destruktorze, np. jeśli w konstruktorze przypisuję atrybutom klasy pewne wartości (podane jako parametry)?

  1. Przede wszystkim zwalnianie dynamicznie przydzielonej pamięci. Czyli dla przykładu jeśli mamy klasę która przechowuje listę elementów - elementy muszą być usunięte/przeniesione jeśli lista ma być zniszczona.
  2. "wyrejestrowanie" się z różnych miejsc programu. Dla przykładu tworzysz obiekt klasy Foo który przechwytuje pewne zdarzenia od innego obiektu klasy Bar. Jeśli obiekt Foo jest niszczony to trzeba powiadomić o tym obiekt Bar.
  3. Zamykanie wszelakich otwartych uchwytów (połączenia z bazą danych, pipe'y, sockety...).

Każde pole klasy zostanie zwolnione automatycznie. Jeśli polem klasy jest obiekt string to ten string zostanie zniszczony. Jeśli polem klasy jakiś wskaźnik - wtedy sam wskaźnik jest niszczony, ale to, na co wskazuje już nie jest tykane.

// EDIT

class NazwanaTablica {
public:
    string nazwa;
    int *elementy;

    NazwanaTablica(int rozmiar, string nazwa)
    {
        this->nazwa = nazwa;
        this->elementy = new int[rozmiar];
    }

    ~NazwanaTablica()
    {
        // Obiekt ''nazwa'' (string) oraz ''elementy'' (wskaźnik) będą automatycznie zniszczone.
        // Ale dynamicznie utworzona pamięć na którą wskaźnik wskazuje już tknięta nie będzie. Dlatego niszczymy ją sami:
        delete[] this->elementy;
    }
};

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