[ Kurt2 @ 06.05.2006. 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?
[ NrmMyth @ 06.05.2006. 16:11 ] @
ovo je niz
Code:
temp= new SLLNode<T>*[c-1];

a ovako ga unistis
Code:
delete [] temp;
[ Kurt2 @ 06.05.2006. 16:23 ] @
Probao sam bez petlje, samo delete [] temp, i opet mi puca, baš na tom delete!
[ #Ninja# @ 06.05.2006. 17:43 ] @
dodaj temp = NULL; možda to pravi problem (malo vjerovatno).
[ Kurt2 @ 06.05.2006. 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...
[ NrmMyth @ 06.05.2006. 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... ???
[ z@re @ 06.05.2006. 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]
[ kiklop74 @ 06.05.2006. 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;
        }



[ #Ninja# @ 06.05.2006. 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.
[ NrmMyth @ 06.05.2006. 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.
[ #Ninja# @ 07.05.2006. 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.
[ Kurt2 @ 07.05.2006. 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.