2015-02-07 9 views
5

È sicuro e/o una buona pratica fare qualcosa come segue?Riutilizzare un puntatore dopo `cancella`

//NewList is a member function of a class 
void NewList(int size){ 

delete[] list; //list is a member variable; an already initialized dynamic array. 

list=new ListObject[size]; 

} 

praticamente sto scartando la matrice precedente perché userò dati diversi per memorizzare nella classe, e quindi richiedono una nuova list per memorizzare altre informazioni sui nuovi dati. Se questa non è una buona pratica, qual è l'alternativa?

+2

** Usa un 'vector' **. –

+0

Hai letto la [Regola del Tre] (https://stackoverflow.com/questions/4172722/what-is-the-rule-of-three)? È legale assegnare un puntatore alla nuova memoria, indipendentemente dal fatto che sia ** sicuro ** dipende dal resto del codice. –

+0

"È sicuro e/o una buona pratica fare qualcosa come segue?" Sì, è sicuro. Se è buono è soggetto a opinioni. –

risposta

3

Dipende. Ogni volta che crei un oggetto con un nuovo, devi cancellarlo dopo l'uso. Nella funzione data stai cancellando per crearne uno nuovo, ma stai cancellando anche quando hai finito con l'oggetto? È più sicuro creare il tuo oggetto e fare in modo che il sistema lo elimini quando l'oggetto è fuori portata.

Eviterei, se possibile, di creare una perdita di memoria se non eliminata in modo appropriato.

2

Sì, è assolutamente perfetto riutilizzare un puntatore per memorizzare un nuovo indirizzo di memoria dopo aver eliminato la memoria precedente a cui punta.

Basta fare attenzione a non dereferenziare il vecchio indirizzo di memoria che è ancora memorizzato nel puntatore. Nel tuo snippet di codice non è un problema però.

Come nota a margine, la maggior parte delle volte, è necessario utilizzare std::vector se si desidera un array ad allocazione dinamica, come menzionato nei commenti.

1

Non c'è nulla di intrinsecamente sbagliato in quello che stai facendo. Tuttavia, se è una funzione membro di una classe e list è una variabile membro, si tenga presente che il codice che si possiede è non protetto da.

In altre parole, se la chiamata a new[] non riesce per qualche motivo, l'array list è stato distrutto e non è possibile ripristinare i dati.

migliore per fare questo:

void NewList(int size) 
{ 
    ListObject* temp = new ListObject[size]; 
    delete[] list; 
    list = temp; 
} 

Se la chiamata a new[] genera un'eccezione, non avete distrutto i dati originali.

Tuttavia, tutto ciò viene risolto se si è utilizzato std::vector, come altri hanno suggerito.

Problemi correlati