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

R. 46 - czy w tym kodzie dochodzi do wycieku pamięci?

Ostatnio zmodyfikowano 2019-09-30 14:42
Autor Wiadomość
rottingham
Temat założony przez niniejszego użytkownika
R. 46 - czy w tym kodzie dochodzi do wycieku pamięci?
» 2019-09-26 21:55:39
Mam pytanie. Nie jestem pewien czy dobrze zrozumiałem ten temat. Stąd moje pytanie: czy ten kod jest sensowny i czy tutaj dochodzi do wycieku pamięci?

C/C++
#include <iostream>
#include <memory>

using namespace std;

struct Wezel
{
    int liczba;
    shared_ptr < Wezel > nastepny;
};

struct Lista
{
    shared_ptr < Wezel > glowa, ogon;
};

void dodajKoniec( int liczba, Lista & lista )
{
    shared_ptr < Wezel > nowy( new Wezel );
    nowy->liczba = liczba;
    nowy->nastepny = nullptr;
   
    if( lista.glowa )
    {
        lista.ogon = lista.ogon->nastepny = nowy;
    }
    else
    {
        lista.ogon = lista.glowa = nowy;
    }
}

void wypisz( Lista lista )
{
    while( lista.glowa )
    {
        cout << lista.glowa->liczba << " ";
        lista.glowa = lista.glowa->nastepny;
    }
}

int main()
{
    int liczba;
   
    {
        Lista lista;
       
        while( cin >> liczba, liczba )
             dodajKoniec( liczba, lista );
       
        wypisz( lista );
    }
   
}
P-175236
pekfos
» 2019-09-26 22:02:48
Kod jest dobry i nic nie cieknie. Chyba trzeba dopisać do lekcji, jak można doprowadzić do wycieku pamięci z std::shared_ptr<>, żeby wiedzieć czego nie robić. Hmm..
P-175237
rottingham
Temat założony przez niniejszego użytkownika
» 2019-09-26 22:14:30
Ok, bardzo dziękuję za odpowiedź.

Pozdrawiam!

EDIT.
W sumie to przedwcześnie zamknąłem. Mam jeszcze pytanie: jak mogę sprawdzić, że te wskaźniki zwalniają pamięć?
P-175238
pekfos
» 2019-09-27 17:36:22
Możesz użyć std::weak_ptr<>, tak jak jest zademonstrowane na przykładzie w kursie. Chyba, że chcesz mieć dowód, że naprawdę pamięć jest zwalniana, a nie tylko że te smart pointery tak mówią, do tego możesz użyć jakiegoś typu, który ma widoczne efekty uboczne podczas jego niszczenia - na przykład klasa z ostatniego przykładu w » Programowanie obiektowe, C++ » PodstawyKonstruktory i destruktory lekcja.
Technicznie rzecz biorąc to wciąż pokazuje tylko, czy obiekt jest niszczony, a nie czy zwalniana jest pamięć na której się znajdował. Sprawdzanie faktycznego zwalniania pamięci to już by była paranoja w tym wypadku ;)
P-175243
rottingham
Temat założony przez niniejszego użytkownika
» 2019-09-30 14:42:23
Rozumiem. Dzięki wielkie za pomoc.

Pozdrawiam!
P-175267
« 1 »
  Strona 1 z 1