2009-04-04 12 views
8

Penso che tutti comprendiamo la necessità di eliminare quando si riassegna un puntatore ad allocazione dinamica per evitare perdite di memoria. Tuttavia, sono curioso, fino a che punto il C++ impone l'uso di delete? Per esempio, prendete il seguente programmaIl nuovo deve essere sempre seguito da eliminare?

int main() 
{ 
    int* arr = new int[5]; 
    return 0; 
} 

Mentre per tutti gli effetti senza perdite si verifica qui (dal momento che il programma sta finendo e il sistema operativo ripulire tutta la memoria una volta che ritorna), ma fa lo standard ancora bisogno - - o consiglia - l'uso di delete [] in questo caso? In caso contrario, ci sarebbe un altro motivo per cui dovresti eliminare [] qui?

risposta

10

Non c'è nulla che richiede un delete [] nella norma - Tuttavia, direi che è un ottimo linea guida da seguire.

Tuttavia, è preferibile utilizzare un comando di cancellazione o cancellazione [] con ogni operazione nuova o nuova [], anche se la memoria verrà eliminata dalla terminazione del programma.

Molti oggetti personalizzati avranno un distruttore che ha altra logica rispetto alla semplice pulizia della memoria. L'uso di delete garantisce la distruzione in questi casi.

Inoltre, se mai ti muovi nella routine, è meno probabile che causi perdite di memoria in altri punti del tuo codice.

0

Sei perfettamente libero di dimenticare di eliminare le cose.

Ti piace sprecare memoria?

1

Qui no. Ma man mano che il programma diventa più grande e complesso, gestisco la mia memoria in modo da poter rintracciare i bug più velocemente. Lo standard non dice nulla, ma entrare in buone abitudini nel caso più piccolo porta a un codice migliore a lungo termine.

+0

In effetti, voglio dire che mi ritrovo spesso a digitare le istruzioni delete [] proprio prima del ritorno, anche se sapevo (a livello pratico) che non faceva differenza. E non è un'abitudine che sto cercando di fermare - ero solo interessato alla misura in cui lo standard lo raccomandava. – GRB

0

non so la standard, ma c'è uno stile di programmazione tutta intorno a questa domanda: crash-only softxare basi di dati Teoricamente o kernel del sistema operativo dovrebbe essere sviluppato come tale, ma spesso non è molto pratica da usare loro così perché al riavvio c'è qualche pulizia che può essere lunga. Inoltre i sistemi dipendenti (programmi all'interno di un sistema operativo o client di database) potrebbero non essere solo in modalità di arresto anomalo.

7

Dupe di Is there a reason to call delete in C++ when a program is exiting anyway?

risposta è che a causa di distruttori che hanno bisogno di essere eseguito, a volte è necessario per eliminare l'oggetto prima di uscire dal programma. Inoltre, molti strumenti per il rilevamento delle perdite di memoria si lamenteranno se non lo fai, quindi per trovare più facilmente perdite di memoria, dovresti provare a eliminare tutti gli oggetti prima di uscire.

+0

Mi mancava quello! :) –

+0

Sì, era in realtà un po 'difficile da trovare; Mi hai battuto sul posto da quando ho trovato il tempo per trovare quell'articolo, come sapevo che era stato chiesto negli ultimi giorni. –

Problemi correlati