Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
Gost
|
|
[Vrh] |
|
Gost
|
|
[Vrh] |
|
Matko Forumaš(ica)
Pridružen/a: 15. 06. 2003. (01:56:38) Postovi: (57)16
|
Postano: 0:41 ned, 12. 10. 2003 Naslov: |
|
|
Razlog zasto gornji program ne radi jest kako slijedi.
Unutar bloka koji pripada funkciji main postoje dva int pointera polje0 i polje1 koji u startu pokazuju na neke dinamicki alocirane komade memorije. Pretpostavljam da je zamisljeno da bi se unutar bloka koji pripada if-ovima u while petlji naizmjence trebala alocirati memorija za jedan od pointera polje0 ili polje1, dok bi se za onaj drugi prethodno alocirana memorija oslobodila. No, problem je u tome sto se unutar tih if-blokova deklariravaju lokalni int pointeri polje1 odnosno polje0, koji nakon izlaska iz bloka vise ne postoje, a alocirana memorija na koju su oni pokazivali ostane negdje visiti. Pozivi delete operatora pak oslobadjaju memoriju na koju pokazuju "globalniji" (tj. oni koji pripadaju main-u) pointeri polje0 i polje1. Nakon provedene dealokacije memorije ti pointeri ne pokazuju vise ni na nista smislenog, pa ponovni poziv delete-a na te iste pointere je kvalitetan razlog da dolazi do "rusenja" programa.
Ono sto bi trebalo promijeniti da program radi jest izbaciti deklaraciju lokalnih pointera polje0 i polje1 unutar if-blokova i ostaviti samo njihovu inicijalizaciju.
Dakle, umjesto:
[code:1]int *polje0=new int[vel_polja0];[/code:1]
neka pise:
[code:1]polje0=new int[vel_polja0];[/code:1]
Razlog zasto gornji program ne radi jest kako slijedi.
Unutar bloka koji pripada funkciji main postoje dva int pointera polje0 i polje1 koji u startu pokazuju na neke dinamicki alocirane komade memorije. Pretpostavljam da je zamisljeno da bi se unutar bloka koji pripada if-ovima u while petlji naizmjence trebala alocirati memorija za jedan od pointera polje0 ili polje1, dok bi se za onaj drugi prethodno alocirana memorija oslobodila. No, problem je u tome sto se unutar tih if-blokova deklariravaju lokalni int pointeri polje1 odnosno polje0, koji nakon izlaska iz bloka vise ne postoje, a alocirana memorija na koju su oni pokazivali ostane negdje visiti. Pozivi delete operatora pak oslobadjaju memoriju na koju pokazuju "globalniji" (tj. oni koji pripadaju main-u) pointeri polje0 i polje1. Nakon provedene dealokacije memorije ti pointeri ne pokazuju vise ni na nista smislenog, pa ponovni poziv delete-a na te iste pointere je kvalitetan razlog da dolazi do "rusenja" programa.
Ono sto bi trebalo promijeniti da program radi jest izbaciti deklaraciju lokalnih pointera polje0 i polje1 unutar if-blokova i ostaviti samo njihovu inicijalizaciju.
Dakle, umjesto:
Kod: | int *polje0=new int[vel_polja0]; |
neka pise:
Kod: | polje0=new int[vel_polja0]; |
|
|
[Vrh] |
|
|