Domanda

Quindi ho un puntatore ad un array di puntatori.Se posso eliminarlo come questo:

delete [] PointerToPointers;

Sarà che elimina tutte le indicò puntatori come bene?Se non, devo ciclo su tutti i puntatori ed eliminare anche loro, o c'è un modo più semplice per farlo?Il mio google-fu non sembra darmi qualche buona risposta a questa domanda.

(E sì, so che ho bisogno di utilizzare un vettore.Questo è uno di quei "prendere sul C++" le assegnazioni del tipo di scuola.)

È stato utile?

Soluzione

Sì, avete di circuito indicatori, di eliminare singolarmente.

Motivo:Che cosa se il codice era puntatori agli oggetti nella matrice?Il compilatore C++ non so se è vero o no, quindi devi essere esplicito.

Per una "via più facile", due suggerimenti:(1) Fare una subroutine per questo scopo, così almeno non devi scrivere il codice più di una volta.(2) Utilizzare la funzione "smart pointer" paradigma di progettazione dove si tiene un array di oggetti con riferimento contatori, quindi gli oggetti che vengono eliminati quando gli oggetti non sono più a cui fa riferimento il codice.

Altri suggerimenti

Sono d'accordo con Jason Cohen anche se ci può essere un po ' più chiara la ragione per la necessità di eliminare i puntatori con il loop.Per ogni "nuovo" o di allocazione dinamica della memoria ci deve essere un "eliminare" una memoria de-allocazione.Alcune volte il "eliminare" può essere nascosto, come smartpointers, ma è ancora lì.

int main()
{
  int *pI = new int;
  int *pArr = new int[10];

finora nel codice che abbiamo assegnato due blocchi di memoria dinamica.Il primo è solo un generale di tipo int e il secondo è un array di interi.

  delete pI;
  delete [] pArr;

queste delete cancella la memoria allocata dalla "nuova"s

  int ppArr = new int *[10];

  for( int indx = 0; indx < 10; ++indx )
  {
    ppArr[indx] = new int;
  }

Questo pezzo di codice è fare in entrambi i precedenti assegnazioni.Prima ci sono la creazione di spazio per i nostri int in un array dinamico.Abbiamo quindi bisogno per il ciclo e allocare un int per ogni punto della matrice.

  for( int indx = 0; indx < 10; ++indx )
  {
    delete ppArr[indx];
  }
  delete [] ppArr;

Notare l'ordine che ho allocato la memoria e, quindi, che I de-assegnati in ordine inverso.Questo perché, se dovessimo fare il delete [] ppArr;prima si perde la matrice che ci dice ciò che i nostri altri puntatori.Quel pezzo di memoria o sarebbe stata restituita al sistema e quindi non è più possibile leggere in modo affidabile.

  int a=0;
  int b=1;
  int c=2;

  ppArr = new int *[3];

  ppArr[0] = &a;
  ppArr[1] = &b;
  ppArr[2] = &c;

Questo credo debba essere menzionata.Solo perché si sta lavorando con i puntatori non significa che la memoria di quei puntatori punto è stato allocato dinamicamente.Vale a dire che solo perché si ha un puntatore non significa che necessariamente deve essere eliminare.L'array che ho creato qui è allocata in modo dinamico, ma i puntatori punto di istanze locali di int Quando si elimina questo abbiamo solo bisogno di eliminare la matrice.

  delete [] ppArr;

  return 0;

}

Alla fine allocato dinamicamente la memoria può essere difficile e in ogni caso si può avvolgere in modo sicuro come in un puntatore intelligente o utilizzando contenitori stl invece proprio può rendere la vostra vita molto più piacevole.

Vedere boost puntatore contenitore per un contenitore che non l'eliminazione automatica dei contenuti puntatori per voi, pur mantenendo una sintassi molto vicina ai normali contenitori STL.

I puntatori sono praticamente solo i riferimenti di memoria e non spiffy po ' di auto-pulizia .net oggetti.La creazione di un corretto distruttori per ogni classe farà l'eliminazione di un po ' più pulito di enorme loop tutto il codice.

Diamo un' (pseudocoded) esempio del mondo reale .Immaginare che si aveva una classe come questa:

class Street
{
    public:
        Street();
        ~Street();
    private:
        int HouseNumbers_[];
}

typedef *Street StreetSign;

Se si dispone di una matrice di segnali stradali, e si elimina la matrice di streetsigns, che non significa che non si elimina automaticamente il sreets.Sono ancora lì, mattoni e malta, ma semplicemente non hanno quei segni che punta più a loro.Si sono sbarazzati di quelli specifici le istanze di puntatori per le strade.

Un array di puntatori è (concettualmente) un po ' come un array di interi, si tratta di un array di numeri che rappresentano le posizioni di memoria di vari oggetti.Non gli oggetti stessi.

Se si elimina[] array di puntatori, tutto quello che dovete fare è eliminare un array di interi.

Penso che si sta andando ad avere per eseguire un ciclo ho paura.

Non so perché questo è stato risposto in modo eccessivamente lungo.

Se si elimina l'array di puntatori, sarà gratuito lo spazio di memoria per un array di interi.
un puntatore a un oggetto è un intero che contiene l'indirizzo.

Si elimina un sacco di indirizzi, ma non gli oggetti.

eliminare non si cura il contenuto di uno spazio di memoria, chiama un distruttore(s) e segna il mem gratuito.

Non importa che appena eliminato un gruppo di indirizzi di oggetti, semplicemente vede int.

Ecco perché è necessario scorrere l'array prima!e chiamare delete su ogni elemento, è possibile eliminare la memorizzazione della matrice stessa.

Bene, ora il mio la risposta ha un po ' lungo.......strano...;)

Edit:Jason risposta non è sbagliato, semplicemente non riesce a colpire il punto.Né il compilatore né alcun'altra c(++) si preoccupa per voi eliminazione di roba che è altrove puntato.Si può semplicemente farlo.Altre parti del programma, cercando di utilizzare gli oggetti eliminati sarà segfault su di voi.Ma non si ostacolano.Non sarà un problema per distruggere un array di puntatori a oggetti, quando gli oggetti si fa riferimento altrove.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top