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

Brisanje niza pokazivača

[es] :: C++ programiranje :: Brisanje niza pokazivača

[ Pregleda: 845 | Odgovora: 11 ]

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Kurt2
Miša iz Daleka
SCG

Član broj: 79835
Poruke: 68
..nis1-nis.customer.sbb.co.yu.

ICQ: 156109951


Profil

icon Brisanje niza pokazivača06.05.2006. u 14:58
Imam problem sa brisanjem niza pokazivača. Kod izgleda otprilike ovako:

Code:

SLLNode<T> **temp;
        temp= new SLLNode<T>*[c-1];
.
.
.
while (tmp!=NULL){
            temp[i++]=tmp;
            tmp=tmp->next;
        }
.
.
.
for( int i = 0; i < c-1; i++)
            delete [] temp[i];
        delete [] temp;


F-ja iz koje je izvučen ovaj kod radi sve kako treba, ali puca kod brisanja niza. Kako ispravno odraditi brisanje?
06.05.2006. u 14:58 

NrmMyth
Split, Kaštela

Član broj: 63456
Poruke: 839
*.cmu.carnet.hr.



Profil

icon Re: Brisanje niza pokazivača06.05.2006. u 16:11
ovo je niz
Code:
temp= new SLLNode<T>*[c-1];

a ovako ga unistis
Code:
delete [] temp;

06.05.2006. u 16:11 

Kurt2
Miša iz Daleka
SCG

Član broj: 79835
Poruke: 68
..nis1-nis.customer.sbb.co.yu.

ICQ: 156109951


Profil

icon Re: Brisanje niza pokazivača06.05.2006. u 16:23
Probao sam bez petlje, samo delete [] temp, i opet mi puca, baš na tom delete!
06.05.2006. u 16:23 

#Ninja#
Tuzla

Član broj: 28925
Poruke: 250
*.PPPoE-807.sa.bih.net.ba.



Profil

icon Re: Brisanje niza pokazivača06.05.2006. u 17:43
dodaj temp = NULL; možda to pravi problem (malo vjerovatno).
06.05.2006. u 17:43 

Kurt2
Miša iz Daleka
SCG

Član broj: 79835
Poruke: 68
..nis1-nis.customer.sbb.co.yu.

ICQ: 156109951


Profil

icon Re: Brisanje niza pokazivača06.05.2006. u 17:58
Ovo mi jeste rešilo problem, ali zar u ovom slučaju ne ostaje neoslobođeno parče memorije koje takođe treba da se obriše? Jer, temp je pokazivao na nešto, sada ni na šta ne pokazuje, i obrisan je, a to nešto je ostalo u memoriji...
06.05.2006. u 17:58 

NrmMyth
Split, Kaštela

Član broj: 63456
Poruke: 839
*.cmu.carnet.hr.



Profil

icon Re: Brisanje niza pokazivača06.05.2006. u 19:01
Rijesenje sa NULL bi upalilo u .NET-u ili Javi, ali u jezicima bez "smecara" to ostavlja zauzeti blek memorije koji nikome vise ne treba...

A jeli ti problem prepustiti alokaciju std::vector<> -u i nakraju samo lijepo ocistis njega i odu svi problemi... ???
06.05.2006. u 19:01 

z@re
Zarko Bulatovic
Split, Spinut

Član broj: 29849
Poruke: 414
*.cmu.carnet.hr.

Sajt: www.freebsd.org


Profil

icon Re: Brisanje niza pokazivača06.05.2006. u 19:14
Probaj sa
Code:
delete temp[i]
, pa onda delete [] temp. Dakle samo makni zagrade na prvom brisanju.

Neisprobano, ali prilikom brisanja dimenzija se ne brise polje dimenzije, vec clanovi dimenzije.

[Ovu poruku je menjao z@re dana 06.05.2006. u 20:24 GMT+1]
[12:33am] <alek> deca od 3-5 godina prvi spoznaju ljubav bozju :)


Q: HSP56 Micromodem nece da radi kompjuter ga prepozna a kad treba da se konektujem nece ne daje ni znaka zivota. u cemu je problem.

A: Crko mozda od grmljavine mozda od spanaca. Uglavnom baci ga u WC solju jako povuci vodu. Skupi 5e i uzmi drugi i ne postuj temu na pogresno mesto.
06.05.2006. u 19:14 

kiklop74
Darko Miletić
Buenos Aires

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



Profil

icon Re: Brisanje niza pokazivača06.05.2006. u 21:29
Kakav nakaradni kod. Stvarno nema potrebe za celom tom zapetljancijom. Bolje je nesto kao ovako:

Code:


#include <vector>

typedef std::vector< SLLNode<T>* > SSLNodeArray;
typedef std::vector< SLLNode<T>* >::iterator SSLNodeArrayIterator;

SSLNodeArray temp;
temp.resize(c);
.
.
.
while (tmp!=NULL){
            temp[i++]=tmp;
            tmp=tmp->next;
        }
.
.
.


for ( SSLNodeArrayIterator iter = temp.begin(); iter != iter.end(); ++iter) {
   delete *iter;
}



Ili jos bolje uz malo RAII da se olaksa stvar:

Code:

#include <vector>

typedef std::vector< SLLNode<T>* > SSLNodeArray;
typedef std::vector< SLLNode<T>* >::iterator SSLNodeArrayIterator;

struct SSLHolder{
explicit  SSLHolder(SSLNodeArray* it) : m_item(NULL) {
     if (it != NULL) {
        m_item = it;
     }
  }
  ~SSLHolder() {
     if (m_item != NULL) {
       for ( SSLNodeArrayIterator iter = m_item->begin(); iter != m_item->end(); ++iter) {
         delete *iter;
       }
       delete m_item;
       m_item=NULL;
     }
  }
private:
  SSLNodeArray* m_item;
};

SSLNodeArray* temp = new SSLNodeArray;
SSLHolder arrayGuard(temp);
.
.
.
while (tmp!=NULL){
            temp->push_back(tmp);
            tmp=tmp->next;
        }




Tko leti vrijedi
06.05.2006. u 21:29 

#Ninja#
Tuzla

Član broj: 28925
Poruke: 250
*.PPPoE-807.sa.bih.net.ba.



Profil

icon Re: Brisanje niza pokazivača06.05.2006. u 21:38
Citat:
Kurt2: Ovo mi jeste rešilo problem, ali zar u ovom slučaju ne ostaje neoslobođeno parče memorije koje takođe treba da se obriše? Jer, temp je pokazivao na nešto, sada ni na šta ne pokazuje, i obrisan je, a to nešto je ostalo u memoriji...

Prvo si obrisao dinamički niz pa si pokazivač postavio na nulu. Znači imaš pokazivač koji ne pokazuje ni na šta, što ne predstavlja problem. Ono nešto je ostalo u memoriji, ali ta memorija je predata operativnom sistemu na dalje korištenje.
06.05.2006. u 21:38 

NrmMyth
Split, Kaštela

Član broj: 63456
Poruke: 839
*.cmu.carnet.hr.



Profil

icon Re: Brisanje niza pokazivača06.05.2006. u 23:27
Citat:
#Ninja#:Ono nešto je ostalo u memoriji, ali ta memorija je predata operativnom sistemu na dalje korištenje.

Koja ce se tek proglasiti slobodnom nakon sto se tvoj program zavrsi... a to je eticki (programerski) neprihvatljivo.
06.05.2006. u 23:27 

#Ninja#
Tuzla

Član broj: 28925
Poruke: 250
*.PPPoE-81.sa.bih.net.ba.



Profil

icon Re: Brisanje niza pokazivača07.05.2006. u 10:13
Upravo je svrha delete operacije da oslobodi memoriju koja je zauzeta operacijom new. Poslije brisanja program može taj dio memorije upotrebljavati kao da nikad nije ni bio zauzet.
07.05.2006. u 10:13 

Kurt2
Miša iz Daleka
SCG

Član broj: 79835
Poruke: 68
..nis1-nis.customer.sbb.co.yu.

ICQ: 156109951


Profil

icon Re: Brisanje niza pokazivača07.05.2006. u 10:31
Varijantu sa #include <vector> ne mogu da koristim, jer je ceo kod za potrebe jednog predmeta na fakultetu, tako da je suština i naučiti rad sa poljima, kao i brisanje ovakvih elemenata. Konkretan kod je izvučen iz f-je bubble sort koju sam pisao za jednostruku lančanu listu inače.
07.05.2006. u 10:31 

[es] :: C++ programiranje :: Brisanje niza pokazivača

[ Pregleda: 845 | Odgovora: 11 ]

Postavi temu Odgovori

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