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

operowanie pamięcią new delete.

Ostatnio zmodyfikowano 2017-05-27 20:50
Autor Wiadomość
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?

C/C++
Class Klasa
{
private:
    int * wskaznik;
public:
    void funkcja();
   
    Klasa();
    ~Klasa();
}

Klasa::Klasa()
{
    //tutaj nie wie czy ma być Null czy new int
   
    wskaznik = NULL;
}

Klasa::~Klasa()
{
    delete[] wskaznik;
}

void Klasa::funkcja()
{
    int i;
    std::cin >> i;
   
    wskaznik = new int[ i ];
   
    // i jakies operacje na wskazniku;
   
}

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ę :)
P-161660
karambaHZP
» 2017-05-27 14:42:27
C/C++
Klasa::Klasa()
{
    //tutaj nie wie czy ma być Null czy new int
   
    wskaznik = nullptr;
}

Klasa::~Klasa()
{
    delete[] wskaznik;
    wskaznik = nullptr;
}
 Bolączki powinny ustąpić.
P-161663
Monika90
» 2017-05-27 15:12:33
C/C++
int main()
{
    Klasa obiekt;
    obiekt.funkcja();
    obiekt.~Klasa(); //<- przez to destruktor jest wywołany dwa razy - to źle.
}


C/C++
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.
P-161665
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ę :)
P-161666
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.
P-161667
karambaHZP
» 2017-05-27 18:01:23
C/C++
obiekt.~Klasa(); //<- przez to destruktor jest wywołany dwa razy - to źle.
Czyli jawne użycie destruktora nie anuluje domyślnego wywołania?
P-161670
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.
P-161673
karambaHZP
» 2017-05-27 20:50:29
Dzięki jankowalski25.
P-161683
« 1 »
  Strona 1 z 1