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

Brisanje niza pokazivača

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

[ Pregleda: 3748 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Kurt2
SCG

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

ICQ: 156109951


+9 Profil

icon Brisanje niza pokazivača06.05.2006. u 14:58 - pre 218 meseci
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?
 
Odgovor na temu

NrmMyth
Ivan Maček
Split

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

Sajt: www.dump.hr


Profil

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

a ovako ga unistis
Code:
delete [] temp;
 
Odgovor na temu

Kurt2
SCG

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

ICQ: 156109951


+9 Profil

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

#Ninja#
Tuzla

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



+1 Profil

icon Re: Brisanje niza pokazivača06.05.2006. u 17:43 - pre 218 meseci
dodaj temp = NULL; možda to pravi problem (malo vjerovatno).
 
Odgovor na temu

Kurt2
SCG

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

ICQ: 156109951


+9 Profil

icon Re: Brisanje niza pokazivača06.05.2006. u 17:58 - pre 218 meseci
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...
 
Odgovor na temu

NrmMyth
Ivan Maček
Split

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

Sajt: www.dump.hr


Profil

icon Re: Brisanje niza pokazivača06.05.2006. u 19:01 - pre 218 meseci
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... ???
 
Odgovor na temu

z@re
Zarko Bulatovic
Split

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



+25 Profil

icon Re: Brisanje niza pokazivača06.05.2006. u 19:14 - pre 218 meseci
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]

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.
 
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: Brisanje niza pokazivača06.05.2006. u 21:29 - pre 218 meseci
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
 
Odgovor na temu

#Ninja#
Tuzla

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



+1 Profil

icon Re: Brisanje niza pokazivača06.05.2006. u 21:38 - pre 218 meseci
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.
 
Odgovor na temu

NrmMyth
Ivan Maček
Split

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

Sajt: www.dump.hr


Profil

icon Re: Brisanje niza pokazivača06.05.2006. u 23:27 - pre 218 meseci
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.
 
Odgovor na temu

#Ninja#
Tuzla

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



+1 Profil

icon Re: Brisanje niza pokazivača07.05.2006. u 10:13 - pre 218 meseci
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.
 
Odgovor na temu

Kurt2
SCG

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

ICQ: 156109951


+9 Profil

icon Re: Brisanje niza pokazivača07.05.2006. u 10:31 - pre 218 meseci
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.
 
Odgovor na temu

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

[ Pregleda: 3748 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

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