operowanie pamięcią new delete.
Ostatnio zmodyfikowano 2017-05-27 20:50
Anim Temat założony przez niniejszego użytkownika |
operowanie pamięcią new delete. » 2017-05-27 13:57:10 Cześć. Otóż jak zwykle źle zarządzam pamięcią. Czy ktoś mógłby mi wskazać co robię źle? Class Klasa { private: int * wskaznik; public: void funkcja(); Klasa(); ~Klasa(); }
Klasa::Klasa() { wskaznik = NULL; }
Klasa::~Klasa() { delete[] wskaznik; }
void Klasa::funkcja() { int i; std::cin >> i; wskaznik = new int[ i ]; }
int main() { Klasa obiekt; obiekt.funkcja(); obiekt.~Klasa(); }
Dlaczego zwalnianie pamięci jest błędne? Zawsze mam problemy ze zwalnianiem i dbaniem o porządek po sobie. Niestety valgrind zwraca błąd przy alokacji new int w funkcja()... Pomożecie :( Dziękuję :) |
|
karambaHZP |
» 2017-05-27 14:42:27 Klasa::Klasa() { wskaznik = nullptr; }
Klasa::~Klasa() { delete[] wskaznik; wskaznik = nullptr; } Bolączki powinny ustąpić. |
|
Monika90 |
» 2017-05-27 15:12:33 int main() { Klasa obiekt; obiekt.funkcja(); obiekt.~Klasa(); }
Klasa::~Klasa() { delete[] wskaznik; wskaznik = nullptr; }
Przypisywanie nullptr do wskaźnika w destruktorze nie ma sensu. Można się spodziewać że optymalizator usunie to przypisanie. Dobrą praktyką jest użycie inteligentnych wskaźników albo wektora. |
|
Anim Temat założony przez niniejszego użytkownika |
» 2017-05-27 15:18:03 @Monika90 Czyli zostawić taki destruktor jak mam rozumiem? i Jedyne co powinienem zmienić to nie wywoływać destruktora w mainie? Dobrze zrozumiałem?
Dziękuję :) |
|
Monika90 |
» 2017-05-27 15:26:26 Dobrą praktyką jest użycie inteligentnych wskaźników albo wektora.
|
To powinieneś sobie wziąć do serca przede wszystkim. |
|
karambaHZP |
» 2017-05-27 18:01:23 Czyli jawne użycie destruktora nie anuluje domyślnego wywołania? |
|
jankowalski25 |
» 2017-05-27 18:22:43 @karambaHZP: Koniec zasięgu = koniec istnienia obiektu utworzonego w tym zasięgu = wywołanie destruktora (nawet, jeśli wcześniej został wywołany jawnie). Jest parę wyjątków od tej reguły (chociażby wywołanie std::abort ), ale w tym kodzie tego nie ma. |
|
karambaHZP |
» 2017-05-27 20:50:29 Dzięki jankowalski25.
|
|
« 1 » |