Czy własny konstruktor wymaga własnego destruktora?

Odpowiedz Nowy wątek
2012-06-16 09:30
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)?

Pozostało 580 znaków

2012-06-16 10:02
0

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


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
edytowany 1x, ostatnio: Shalom, 2012-06-16 11:30
Konstruktor ? Nie destruktor ? - cichociemny 2012-06-16 10:32
Oj tam :P - Shalom 2012-06-16 11:30
Mnie się też te dwie nazwy mylą. - cichociemny 2012-06-16 12:33

Pozostało 580 znaków

2012-06-16 10:07
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ć?

Pozostało 580 znaków

2012-06-16 10:11
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;
    }
};
edytowany 4x, ostatnio: adf88, 2012-06-16 10:19

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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