Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Konstruktory i destruktory - usuwanie alokacji wywołanej w osobnych metodach.

Ostatnio zmodyfikowano 2014-12-22 11:53
Autor Wiadomość
Kopczak1995
Temat założony przez niniejszego użytkownika
[C++] Konstruktory i destruktory - usuwanie alokacji wywołanej w osobnych metodach.
» 2014-12-22 10:50:18
Witam. Mam małe pytanie.
Mianowicie bawię się ostatnio nieco w klasy i dotarłem do momentu, w którym nie mam pojęcia czy destruktor zadziała czy też nie. Ciężko będzie wrzucić całość kodu, bo na chwilę obecną jest już mocno rozbudowany ale tu dam same definicje konstruktora i destruktora:
C/C++
matrix::matrix() {
    char x;
    cout
    << "Jakie wartości mają być w komórkach macierzy?" << endl
    << "[1] - liczby całkowite," << endl
    << "[2] - liczby zmiennoprzecinkowe," << endl
    << "[3] - liczby zespolone." << endl;
    for(;; ) {
        x = char( _getch() );
        if( x >= '1' && x <= '3' ) break;
        else cout << x << " - to zły klawisz. Wpisz jeszcze raz." << endl;
       
    }
    cout << "A więc ";
    switch( x ) {
    case '1': { cout << "liczby całkowite." << endl << endl;
            int ** tabA { nullptr }, ** tabB { nullptr };
            this->t
            menu( tabA, tabB );
            break;
        }
    case '2': { cout << "liczby zmiennoprzecinkowe." << endl << endl;
            double ** tabA { nullptr }, ** tabB { nullptr };
            menu( tabA, tabB );
            break;
        }
    case '3': { cout << "liczby zespolone." << endl << endl;
            complex ** tabA { nullptr }, ** tabB { nullptr };
            menu( tabA, tabB );
            break;
        }
    }
}
matrix::~matrix() { }
Sprawa wygląda następująco. Jak widać w konstruktorze w zależności od tego co dalej chcę czynić tworzę 3 różne zestawy wskaźników na tablice. (PS: Ćwiczę szablony funkcji jakby ktoś nie wiedział co tu czynię :P Bawię się w operacje na macierzach zrealizowane dla typów double, int oraz complex - taka moja struktura/klasa dla liczb zespolonych) Potem przekazuję je do dalszych funkcji, a tam już dzieje się magia :P W każdym razie wszystko mi działa ale...
Czy destruktor zadziała dla tablic, których alokacja poprzez instrukcję
new
 pojawia się dopiero później? Jak widać bezpośrednio w bloku instrukcji konstruktora widnieją tablice zainicjowane wartością
nullptr
. Teoretycznie wszystkie zmienne są deklarowane, alokowane itd w jego obrębie. Ba! Całe to moje zadanie bojowe jest wywołane w mainie poprzez "uruchomienie" konstruktora i wszelkie dalsze metody praktycznie odpalają w jego wnętrzu jednak nie mam pewności czy po tym jak klasa zakończy swój żywot to destruktor wywali mi wszelkie dokonane dotąd alokacje...
P-123213
Monika90
» 2014-12-22 11:18:24
tabA, tabB to są zmienne lokalne poza tym blokiem w konstruktorze nie istnieją. Nie wiem co robi funkcja menu, jeżeli po prostu alokuje pamięć i przypisuje jej adres zmiennym tabA i tabB, to masz wyciek pamięci. A twój destruktor nic nie robi.
P-123214
Kopczak1995
Temat założony przez niniejszego użytkownika
» 2014-12-22 11:26:05
Hmmm... Dla wytłumaczenia - funkcja menu ma potem wybrać operacje dodawania, odejmowania oraz mnożenia macierzy. Potrzebowałem tego w tym stanie aby jakoś szablon funkcji "dowiedział się" o jaki typ danych mi chodzi. Dalej już w zależności od wprowadzonych wskaźników na tablice i ich typu wyliczane są dalsze pierdoły.

Dobra, wracając do sedna sprawy - mam rozumieć, że zmienne tabA oraz tabB są praktycznie niewidoczne z punktu widzenia konstruktora, a co za tym idzie destruktor także nie ma szans ich usunąć?

@Edit
Dobra. Rozumiem, że tamto nie działa. Dotarłem właśnie do innego sposobu aby rozwiązać ten problem i parę innych rzeczy, które mnie wcześniej wkurzały :P Popróbuję swych sił przy tworzeniu klasy szablonowej :>

@Down
Co fakt to fakt, temu nie zaprzeczę :D Dopiero zaczynam przygodę z klasami i powiedzmy sobie szczerze, że jeszcze nie ogarniam w pełni natury konstruktorów i destruktorów...

Nic tam nie będę dręczył, dowiedziałem się co chciałem, więc zamknę temat :P
P-123215
Monika90
» 2014-12-22 11:53:18
Nie rozumiesz klas, konstruktorów i destruktorów. Destruktor nie zwolni alokacji, tylko dlatego że były widoczne w konstruktorze.
P-123217
« 1 »
  Strona 1 z 1