[C++] Konstruktory i destruktory - usuwanie alokacji wywołanej w osobnych metodach.
Ostatnio zmodyfikowano 2014-12-22 11:53
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: 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... |
|
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. |
|
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 |
|
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. |
|
« 1 » |