Condivisione della tecnologia

Spiegazione sul problema indefinito di mescolare delete e delete[]

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Sappiamo che delete viene utilizzato per rilasciare uno spazio dinamico e delete[] viene utilizzato per rilasciare più spazi dinamici, ma quali problemi si verificheranno se li mescoliamo? Ho letto molti articoli sul blog, ma non sono soddisfacenti, quindi ho scritto questo articolo per farti sapere di cosa si tratta e perché (Una spiegazione superficiale, correggetemi)。

---------------------------------------------------------------------------------------------------------------------------------

Possiamo prima vedere un esempio:

Il risultato corrente è:

Ma se non scriviamo esplicitamente il distruttore:

Il risultato è un funzionamento normale:

---------------------------------------------------------------------------------------------------------------------------------

Perché?

Se ti chiedo quanto spazio il sistema alloca a questi 10 oggetti di Classe A, molto probabilmente risponderai 40 byte.È facile da capire. Un A è 4 byte e 10 è 40 byte. .Ma in effetti, se si scrive personalmente il distruttore, verranno allocati un totale di 44 byte. Se non si scrive un distruttore, verranno allocati un totale di 40 byte.

Perché ci sono altri 4 byte dopo aver scritto il distruttore? Sappiamo che dopo aver utilizzato delete per liberare questo spazio, il distruttore verrà automaticamente chiamato (http://t.csdnimg.cn/f2FOj), (1) Se scriviamo noi stessi il distruttore, delete deve chiamarlo (In effetti, anche delete è una funzione, che equivale a una chiamata annidata della funzione.), allora quante volte viene chiamato è una domanda. Questi quattro byte hanno esattamente la dimensione di un numero intero. Questo numero intero viene utilizzato per registrare il numero di oggetti in questo spazio, determinando così quante volte devono essere il costruttore e il distruttore. chiamato.Tuttavia, devi sapere che il puntatore p punta ancora al primo oggetto, ma andrà avanti per ottenere il numero di oggetti durante la costruzione e la distruzione., la relazione specifica è la seguente:

(2) Se non scriviamo un distruttore in questo momento, chiamerà il distruttore generato dal compilatore senza registrare il numero di volte (potrebbe comportare un livello inferiore, non ne sono sicuro, correggimi), e non è necessario aprirne uno aggiuntivo.

Ok, ora possiamo spiegare l'esempio sopra

Elimina rilascia spazio dalla posizione indicata dal puntatore per impostazione predefinita; delete[] controlla innanzitutto se è aperto più spazio per impostazione predefinita e, in tal caso, sposta il puntatore in avanti di una posizione prima di rilasciarlo. Se si apre più spazio o si utilizza Elimina per liberare lo spazio, lo spazio aperto non potrà essere rilasciato, causando una perdita di memoria e pertanto verrà segnalato un errore.

Riceverò un errore se lo pratico? :

Non è necessario chiamare il distruttore, non è necessario contare il numero di oggetti e non è necessario aprire più spazio. Pertanto, lo spazio può essere rilasciato dalla posizione indicata dal puntatore, quindi non si verificherà alcun errore riportato.

Ci sono molte situazioni, puoi scendere e provarlo tu stesso.

Mi manca la capacità di esprimermi. Per favore, leggilo alcune volte e otterrai sicuramente qualcosa.