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

Pomoc oko pokazivaca i oslobadjanja memorije

[es] :: C/C++ programiranje :: Pomoc oko pokazivaca i oslobadjanja memorije

[ Pregleda: 1764 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

vladaboy93
Vladimir Makaric
Novi Sad

Član broj: 137777
Poruke: 376
79.101.254.*

Sajt: vladimirmakaric.110mb.com


Profil

icon Pomoc oko pokazivaca i oslobadjanja memorije22.06.2009. u 18:39 - pre 180 meseci
Imam problem oko pointera vertex_array koji koristim kao niz integera, Visual studio komapjler se buni ako ga izbrisem na kraju, a ako ga ne izbrisem sve lepo radi kada ga pokrenem iz VS-a, ali kada pokrenem release verziju ili debug u samom folderu... onda se zapuca. Problem je oko vertex_array-a, ne znam zasto, DevC++ recimo ne moze uopste da pokrene ovaj kod(bez delete).

Code:

CLevel::CLevel(char *file)
{
    FILE *F;
    F=fopen(file,"r+");

    fscanf_s(F,"%d",&poly_count);
    polygons=new CPolygon*[poly_count];

    for(int i=0; i < poly_count; i++)
    {
        fscanf_s(F,"%d",&v_count);
        int *vertex_array=new int[v_count]; // kreiram integer niz jel iz fajla citam broj elemenata, ne znam ga unapred

        for(int j=0; j < v_count*2; j++)
        {
            fscanf_s(F,"%d",&vertex_array[j]); // iz fajla ucitavam vrednosti u taj niz
        }

        polygons[i]=new CPolygon(v_count,vertex_array); //taj niz prosledjujem konstruktoru klase poligon 
        delete[] vertex_array;    // niz mi vise nije potreban i brisem ga..., ovde nastaje problem, ako ovog nema, onda radi kod, al se kasnije zapuca.
    }
}

////////
//konstruktor klase CPolygon
////////

CPolygon::CPolygon(int n,int *i)   
{
    vertex=new CVector[n];

    for(int br=0; br < n*2;br++)
    {
        int df=br+1;
        
        vertex[0+br/2]=CVector(i[br],i[df]);   // ovo je vazno, jel prosledjujem vrednosti vertex_arraya (lokalna varijabla i), po vrenosti a ne po adresi, i zato bi trebalo da mogu da obrisem taj pointer
        br++;
    }     

      // probo sam da ovde izbrisem i, to jest da ga oslobodim. al mi dodje na isto. 
}

 
Odgovor na temu

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.rcub.bg.ac.yu.



+9 Profil

icon Re: Pomoc oko pokazivaca i oslobadjanja memorije22.06.2009. u 19:15 - pre 180 meseci
Zašto u konstruktoru CLevel u unutrašnjoj for petlji ideš do v_count*2, a alocirao si samo v_count elemenata?
I u konstruktoru CPolygon pokušavaš da čitaš elemente koji ne postoje iz vertex_array (odnosno lokalno i).

Šta javlja gcc, tj. DevCPP?

---
Kad rešiš da ne koristiš obične nizove (a nemoj da odugovlačiš), počni da koristiš std::vector.
Ima još detalja koji nisu sjajni u kodu, ali to nisi pitao tako da neću da gnjavim.


 
Odgovor na temu

vladaboy93
Vladimir Makaric
Novi Sad

Član broj: 137777
Poruke: 376
79.101.254.*

Sajt: vladimirmakaric.110mb.com


Profil

icon Re: Pomoc oko pokazivaca i oslobadjanja memorije22.06.2009. u 19:24 - pre 180 meseci
nemogu da verujem kolko sam se zajebo... vec dugo vreme mi stoji taj kod v_count*2 a alociram samo v_count, jednostavno zato sto vektor ima 2 elementa (x i y ), sve je lepo islo dok je VS to pokretao, onda sam danas komapajlirao release, i cudio se zasto nece da se pokrene :)

hvala puno Gorane...


Inace ranije sam koristio vektore, jel mi je bilo lakse, sada sve radim sa pointerima, jel mislim da je efikasnije, posto vektori dolaze do izrazaja kada se dodaju novi elementi, a meni to u ovom slucaju netreba,

dali postoji razlika u brzini, ako koristim vektore i ako sam alociram memoriju, recimo ako ocu nekad da dodam jos jedan element na niz, dali je brze da realokujem ili push_back(elem..)?
 
Odgovor na temu

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 569
*.fibertel.com.ar.

Sajt: ar.linkedin.com/pub/darko..


+13 Profil

icon Re: Pomoc oko pokazivaca i oslobadjanja memorije22.06.2009. u 19:32 - pre 180 meseci
Kada god mozes i kada god to ima smisla (sto je oko 90% slucajeva) koristi standardnu biblioteku.

Prerano optimizovanje radi optimizovanja ne vodi nicemu.
Tko leti vrijedi
 
Odgovor na temu

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.rcub.bg.ac.yu.



+9 Profil

icon Re: Pomoc oko pokazivaca i oslobadjanja memorije22.06.2009. u 20:04 - pre 180 meseci
Citat:
vladaboy93: nemogu da verujem kolko sam se zajebo... vec dugo vreme mi stoji taj kod v_count*2 a alociram samo v_count, jednostavno zato sto vektor ima 2 elementa (x i y ), sve je lepo islo dok je VS to pokretao, onda sam danas komapajlirao release, i cudio se zasto nece da se pokrene :)

hvala puno Gorane...


Inace ranije sam koristio vektore, jel mi je bilo lakse, sada sve radim sa pointerima, jel mislim da je efikasnije, posto vektori dolaze do izrazaja kada se dodaju novi elementi, a meni to u ovom slucaju netreba,

dali postoji razlika u brzini, ako koristim vektore i ako sam alociram memoriju, recimo ako ocu nekad da dodam jos jedan element na niz, dali je brze da realokujem ili push_back(elem..)?


Heh, ako je išta od toga radilo, samo si imao sreće...

Nemoj da brineš oko efikasnosti vektora, oni su ispeglani skoro do maksimuma. Dodavanje se vrši u (skoro) konstantnom vremenu. Po defaultu, dodavanje jednog po jednog elementa u vektor ne prouzrokuje realokaciju svaki put već posle određenog broja elemenata (čini mi se da je u pitanju stepen dvojke, ali to zavisi od implementacije std alokatora).

Koristi i vektore i iteratore zajedno s njima...

Još jedna stvar u vezi tvog koda... vidim po jednom komentaru da si imao ideju da brišeš vertex niz unutar CPolygon konstruktora. Ako ručno alociraš memoriju, pazi vrlo dobro kome daješ odgovornost brisanja da nebi zaboravio da je obrišeš ili probao da je obrišeš više puta. Takođe, kada prosleđuješ argumente, prosleđuj ih kao konstantne (const) kad god možeš čisto da bi bio što sigurniji da li negde imaš side effect ili nemaš... i prouči recimo šta su to konstantne metode, recimo:

Code:

class A
{
  public:
    void neka_funkcija() const; // pronađi šta ovo znači, biće ti jasno, a ako ne, pitaj.
};
 
Odgovor na temu

vladaboy93
Vladimir Makaric
Novi Sad

Član broj: 137777
Poruke: 376
79.101.254.*

Sajt: vladimirmakaric.110mb.com


Profil

icon Re: Pomoc oko pokazivaca i oslobadjanja memorije22.06.2009. u 20:54 - pre 180 meseci
Cini mi se da znam sta je to, da nesme biti promene promenjvih unutar te funckije...

Razumem sta pricas u vezi STL-a ,cesce cu ga koristiti ubuduce.


EDIT:
Dali bi mogao da mi preporucis neku dobru C++ knjigu malo da obnovim zaboravljeno i naucim neke nove fore? ( nemora na srpskom ).

 
Odgovor na temu

[es] :: C/C++ programiranje :: Pomoc oko pokazivaca i oslobadjanja memorije

[ Pregleda: 1764 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

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