Wyciek pamięci?

0

Witam. Mój problem polega na tym, że nie wyświetla mi pola składowego klasy. Krokowo wykonując program i podglądając moje zmienne wartość ginie gdzieś przy wykonywaniu cout<<this->nazwa. Ogólnie program polega na wczytaniu z pliku wartości do obiektu klasy. To wychodzi ładnie. Lecz przy wyświetlaniu nie wyświetla jednej składowej. Dodam jeszcze, że kiedy nie ładuje obiektów z klasy tylko tworze je po uruchomieniu programu (przez odpowiednie funkcje) i potem wyświetlam liste wszystko jest ok. Niże zamieszczam moje pliki.

main

 
#include <iostream>
#include <string>
#include "Produkt.h"
#include "Lista.h"

using namespace std;

int main()
{
    char z;
    Produkt *nowy;
    Lista produkty;

    while(1)
    {
        nowy = new Produkt("",0,0,0);

        system("CLS");
        cout<<"n - Nowy Produkt"<<endl<<"u - Usun Produkta"<<endl<<"w - Wypisz liste Produktow"<<endl<<"s - Znajdz Produkt"<<endl
            <<"o - Wczytaj baze danych"<<endl<<"z - Zapisz do bazy danych"<<endl;
        cin>>z;
        system("CLS");
    
        switch(z)
        {
            case 'n': nowy->Wpisz();
                produkty.Dodaj(*nowy);
                break;
            case 'w': produkty.WypiszListe();
                system("PAUSE");
                break;
            case 'u': nowy->Wpisz();
                produkty.Usun(*nowy);
                break;
            case 's': {
                string nazwa;
                cout<<"Podaj nazwe: ";
                cin>>nazwa;            
                produkty.Szukaj(nazwa);
                system("PAUSE");
                break;
                }
            case 'o': produkty.OdczytajListe(produkty);
                break;
            case 'z': produkty.ZapiszDoPliku();
                system("PAUSE");
                break;
            case 'q': exit(0);
                break;
        }
        
    }
    system("PAUSE");
    return 0;
}

Lista.cpp

 
#include "Lista.h"

Lista::Lista(void)
{
    liczbaProduktow = 0;
    pierwszy=NULL;
    ostatni=NULL;
}
Lista::Lista(const Lista &wzor)
{
    
}
Lista::~Lista(void)
{
    
}
void Lista::Dodaj(const Produkt &p)
{
    Produkt *nowy = new Produkt(p);
    
    if(liczbaProduktow==0) 
    {
        pierwszy=ostatni=nowy;
        pierwszy->nastepny=NULL;
        liczbaProduktow++;
    }
    else
    {
        Produkt *iter = pierwszy;
        Produkt *poprzedni = pierwszy;
        liczbaProduktow++;

        while(iter!=false)
        {
            if(nowy->Porownaj(*iter)<=0)
            {
                nowy->nastepny = iter;
                if(pierwszy==iter)
                    pierwszy=nowy;
                else poprzedni->nastepny=nowy;
                break;
            }
            if(iter->nastepny==false)
            {
                iter->nastepny=nowy;
                ostatni = nowy;
                ostatni->nastepny=NULL;
                break;
            }
            else 
            {
                poprzedni = iter;
                iter = iter->nastepny;
            }
        }
    }
}
void Lista::Usun(const Produkt &wzorzec)
{
    if(pierwszy) 
    {
        Produkt *nastepny;
        Produkt *poprzedni=NULL;
        Produkt *iter=pierwszy;
        while(iter!=false)
        {
            if(wzorzec==*iter)
            {    
                if(wzorzec==*pierwszy)
                {
                    pierwszy = iter->nastepny;
                    delete iter;                    
                    if(liczbaProduktow==0) delete ostatni;                                        
                }
                else
                {    
                    poprzedni->nastepny=iter->nastepny;                    
                    if(wzorzec.Porownaj(*ostatni)==0) ostatni=poprzedni;
                    delete iter;
                }    
                liczbaProduktow--;
                break;
            }
            else if(wzorzec.Porownaj(*iter)>0) 
            {
                if(iter->nastepny==false) 
                {
                    cout<<"Nie znaleziono Produkta o podanych danych"<<endl;
                    break;
                }
                else 
                {
                    poprzedni = iter;
                    iter = iter->nastepny;
                }
            }
            else if(wzorzec.Porownaj(*iter)<0)
            {
                cout<<"Nie znaleziono Produkta o podanych danych"<<endl;
                break;
            }
        }
    }
}
void Lista::WypiszListe() const  
{
    if(liczbaProduktow!=0)
    {
        Produkt *iter = pierwszy;
        while(iter!=NULL)
        {
            iter->Nazwa();
            iter->Wypisz();
            //cout<<iter;
            iter=iter->nastepny;
        }
    }
    else cout<<"Lista produktow jest pusta!"<<endl;
}
const Produkt *Lista::Szukaj(const string nazwa) const
{
    Produkt *iter = pierwszy;
    while(iter!=NULL)
    {
        if((iter->Nazwa()==nazwa)) return iter;
        iter = iter->nastepny;
    }
    return NULL;
}
void Lista::ZapiszDoPliku()
{
    if(liczbaProduktow!=0)
    {
        fstream plik;
        Produkt *iter = pierwszy;
        
        plik.open("bazaProduktow.txt", ios::out);
        if(plik.good())
        {
            while(iter!=NULL)
            {
                if(iter->nastepny==NULL) plik<<iter->Kod()<<endl<<iter->Nazwa()<<endl<<iter->Cena()<<endl<<iter->Ilosc();
                else plik<<iter->Kod()<<endl<<iter->Nazwa()<<endl<<iter->Cena()<<endl<<iter->Ilosc()<<endl;
                iter=iter->nastepny;
            }        
        }
        else cout<<"Nie mozna otworzyc bazy danych"<<endl;
        
        plik.close();
    }
    else cout<<"Lista Produktow jest pusta"<<endl;
}
void Lista::OdczytajListe(Lista &produkty)
{
    Produkt *nowy;
    fstream plik;
    int i;
    
    plik.open("bazaProduktow.txt", ios::in | ios::binary);
    if(plik.good())
    {
        while(!plik.eof())
        {    
            nowy = new Produkt("",0,0,0);
            string nazwa,kod,cena,ilosc;
            getline(plik,kod);        
            getline(plik,nazwa);            
            getline(plik,cena);            
            getline(plik,ilosc);

            int kodPo = atof(kod.c_str());
            float cenaPo = atof(cena.c_str());
            float iloscPo = atof(ilosc.c_str());

            nowy->Nazwa(nazwa);
            nowy->Kod(kodPo);
            nowy->Cena(cenaPo);
            nowy->Ilosc(iloscPo);
            produkty.Dodaj(*nowy);
        }
    }
    else cout<<"Nie mozna otworzyc bazy produktow."<<endl;
}

Lista.h

 #ifndef LISTA_H
#define LISTA_H
#include <iostream>
#include <fstream>
#include "Produkt.h"

using namespace std;

class Lista
{
private: 
    Produkt* pierwszy;
    Produkt* ostatni;
    int liczbaProduktow;
public:
    Lista(void);
    Lista::Lista(const Lista &wzor);
    ~Lista(void);

    void Dodaj(const Produkt &p);
    void Usun(const Produkt &wzorzec);
    void WypiszListe() const;
    const Produkt *Szukaj(const string nazwa) const;
    void ZapiszDoPliku();
    void OdczytajListe(Lista &produkty);
};
#endif

Produkt.cpp

 
#include <iostream>
#include <stdio.h>
#include "Produkt.h"

using namespace std;

Produkt::Produkt(void){}
Produkt::Produkt(const string nazwa, const int kod, const float cena,const float ilosc)
{
    this->nazwa = nazwa;
    this->kod = kod;
    this->cena = cena;
    this->ilosc = ilosc;
    this->nastepny = NULL;
}
Produkt::Produkt(const Produkt &wzor)
{
    this->nazwa = wzor.nazwa;
    this->kod = wzor.kod;
    this->cena = wzor.cena;
    this->ilosc = wzor.ilosc;
    nastepny = wzor.nastepny;
}
Produkt::~Produkt(void)
{

}
const string Produkt::Nazwa() const
{
    return this->nazwa;
}
const int Produkt::Kod() const
{
    return this->kod;
}
const float Produkt::Cena() const
{
    return this->cena;
}
const float Produkt::Ilosc() const
{
    return this->ilosc;
}
void Produkt::Nazwa(string nazwa)
{
    this->nazwa=nazwa;
}
void Produkt::Kod(int kod)
{
    this->kod=kod;
}
void Produkt::Cena(float cena)
{
    this->cena=cena;
}
void Produkt::Ilosc(float ilosc)
{
    this->ilosc=ilosc;
}
void Produkt::Wpisz()
{
    cout<<"Podaj nazwe: ";
    cin>>this->nazwa;
    cout<<"Podaj kod: ";
    cin>>this->kod;
    cout<<"Podaj cene: ";
    cin>>this->cena;
    cout<<"Podaj ilosc: ";
    cin>>this->ilosc;
}
void Produkt::Wypisz()
{
    cout<<this->nazwa<<" "<<this->kod<<" "<<this->cena<<" "<<this->ilosc<<endl;    
}
int Produkt::Porownaj(const Produkt& wzorzec) const
{
    return Nazwa().compare(wzorzec.Nazwa());
}
Produkt &Produkt::operator=(const Produkt &wzor)
{
    this->nazwa = wzor.nazwa;
    this->kod = wzor.kod;
    this->cena = wzor.cena;
    this->ilosc = wzor.ilosc;
    nastepny = wzor.nastepny;

    return *this;        
}
bool Produkt::operator==(const Produkt &wzor) const
{
    if((this->nazwa==wzor.nazwa)&&(this->kod==wzor.kod)&&(this->cena==wzor.cena)) return true;
    else return false;
}
ostream &operator<<(ostream &wy,const Produkt &p)
{
    return wy<<p.nazwa<<" "<<p.kod<<" "<<p.cena<<" "<<p.ilosc;
}

Produkt.h

 
#ifndef PRODUKT_H
#define PRODUKT_H

#include <iostream>
#include <string>

using namespace std;

class Produkt
{
private:
    string nazwa;
    int kod;
    float cena;
    float ilosc;
public:
    Produkt* nastepny;

    Produkt(void);
    Produkt(const string nazwa = "", const int kod=0, const float cena=0,const float ilosc=0);
    Produkt(const Produkt &wzor);
    ~Produkt(void);
    
    const string Nazwa() const;
    const int Kod() const;
    const float Cena() const;
    const float Ilosc() const;
    void Nazwa(string nazwa);
    void Kod(int kod);
    void Cena(float cena);
    void Ilosc(float ilosc);
    void Wypisz();
    void Wpisz();
    int Porownaj(const Produkt& wzorzec) const;
    Produkt &operator=(const Produkt &wzor);
    bool operator==(const Produkt &wzor) const;
    friend ostream &operator<<(ostream &wy,const Produkt &p);
};
#endif

bazaProduktow.txt

123454
Arbuz
12.5
9
987654
Jogurt
1.45
90
123456
Monte
3.4
30
123098
czekolada
3.19
90 

Czyli kiedy odczytuje wartości z pliku i tworzę listę produktów, a następnie wykonuje funkcję wypiszListe() to nie wyświetla nazwy. Jednak jesli załaduje listę z pliku i dodam jeszcze jakiś produkt, a następnie wywołam znowu funkcję wypiszListeZatrudnionych() to widoczna jest nazwa tylko tego jednego obiektu nowo dodanego. Proszę o pomoc. Mam to na jutro. Z góry dzięki za starania.

0

tak właśnie.

0

Ale wyświetla Ci potym jak załadujesz listę z pliku?

0

Z ważniejszych rzeczy które poprawiłem to:

  1. Zaincludowanie 'atof'
  2. Zmiana
Lista::Lista(const Lista &wzor);

na

Lista(const Lista &wzor);

w Lista.
3. Jest też info o niezaincludowanym exit.

0

jak wygląda includowanie atof i exit.? Jakbyś mógł to powiedz czy po tym jak ładujesz liste z pliku i wywołujesz wypiszListe() to czy wyświetla się nazwa produktu?

0

atof i exit jest w cstdlib więc tak:

#include <cstdlib>

Wyświetla 4 wartości w tym nazwa.

0

http://www.cplusplus.com/reference/cstdlib/atof/

wystarczy wpisac w google atof c++ i masz wszystkie informacje

0

Dzięki za pomoc... jednak u mnie nadal nie wyświetla tej nazwy. Mam Visual Studio 2010.

0

bez tego szybko po prostu nie zatrzymuje się... i nie można przeczytać tego co konieczne.

1

Mój kolega znalazł błąd :) "w nazwie miałeś znak powrotu karetki który powodował że kursor w konsoli przeskakiwałna początek linii". rozwiązanie: nazwa.erase(nazwa.length()-1); zaraz za float iloscPo = atof(ilosc.c_str()); w odczytajListe()

0
"Nie znaleziono Produkta o podanych danych"
- to wszystko w tym temacie.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.