Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Curenje memorije

[es] :: C/C++ programiranje :: Curenje memorije

[ Pregleda: 2774 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

mims
studiram

Član broj: 325345
Poruke: 2
92.36.146.*



Profil

icon Curenje memorije27.09.2014. u 12:29 - pre 115 meseci
pomoc hitno!
dakle, problem je sto ne znam zasto se ne dealocira memorija, cak sam uvela i metodu 'rucni_destruktor' i pozvala ga u main-u, i opet curenje -.-
kriticni dio koda je sljedeci:

template <typename TipKljuca, typename TipVrijednosti>
class BSNizMapa : public Mapa <TipKljuca, TipVrijednosti> {

int kapacitet, duzina;
TipVrijednosti prazan;

TipKljuca* nizK;
TipVrijednosti* nizV;

public:

BSNizMapa() : Mapa<TipKljuca, TipVrijednosti>(), kapacitet(1000), duzina(0), prazan(TipVrijednosti())
{
nizK = new TipKljuca[1000];
nizV = new TipVrijednosti[1000];
}

~BSNizMapa()
{
delete[] nizK;
delete[] nizV;
}
....

void rucni_destruktor() {delete[] nizK; delete[] nizV;}
};

int main() {

BSNizMapa<int, int> bsa;

bsa[2]=8;
bsa[4]=6;
bsa[6]=5;

cout<<endl<<"Broj elemenata je: "<<bsa.brojElemenata();
cout<<endl<<bsa[2]<<" "<<bsa[4]<<" "<<bsa[6]<<" ";

bsa.rucni_destruktor();
return 0;
}
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Curenje memorije28.09.2014. u 00:08 - pre 115 meseci
Pretpostavljam da se dealocira sam niz, ali ne i elementi niza. U kodu se nigde ne brišu elementi niza. Treba u destruktoru prvo da obrišeš sve elemente u petlji, pa tek onda i sam niz.
 
Odgovor na temu

mims
studiram

Član broj: 325345
Poruke: 2
92.36.174.*



Profil

icon Re: Curenje memorije29.09.2014. u 20:47 - pre 115 meseci
brisu se i elementi jer se poziva operator delete[], a ne samo delete. zasebno bi trebalo svaki element da je u pitanju dvojni pokazivac, sto ovdje nije slucaj.
naumpalo mi je da problem uzrokuju fje sortiraj i binarna_pretraga, koje pozivam u operatoru [] (nacin na koji se dodaju elemnti je pozivanje nekonstantne verzije opertaora [], pri cemu elementi trebaju ostati sortirani)
Code:

 void sortiraj()
{
    vector<int> v;
    for (int i=0; i<kapacitet; i++)
        if (nizK[i]!=TipKljuca())  v.push_back(i);

    for (int i=1; i<v.size(); i++)
    {
        TipKljuca tmp = nizK[v[i]];
        int j=v[i-1];
        int k=v[i];
        while (j>=0 && nizK[j] > tmp)
        {
            nizK[k]=nizK[j];
        }
           nizK[j]=tmp;
    }

}

int binarna_pretraga(const TipKljuca& kljuc) const
{
    int dno=0;
    int vrh=duzina-1;

    int srednji;
    while (vrh>=dno)
    {
        srednji=(vrh+dno)/2;
        if (nizK[srednji]==kljuc) return srednji;
        else if (nizK[srednji]>kljuc) vrh=srednji-1;
        else dno=srednji+1;
    }
      return srednji;
}

TipVrijednosti& operator[] (const TipKljuca& kljuc) {

    if (duzina==kapacitet) povecaj();

    nizK[duzina] = kljuc;
    nizV[duzina] = TipVrijednosti();
    duzina++;
    if (duzina>1) sortiraj();
    int indeks;
    indeks=binarna_pretraga(kljuc);

    return nizV[indeks];
}

EDIT X Files: Koristite CODE tagove!

[Ovu poruku je menjao X Files dana 29.09.2014. u 22:04 GMT+1]
 
Odgovor na temu

[es] :: C/C++ programiranje :: Curenje memorije

[ Pregleda: 2774 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.