2013-07-14 15 views
7

Sono consapevole che chiamare l'eliminazione su una variabile creata utilizzando il posizionamento nuovo e quindi accedere a quel blocco di memoria ha un comportamento non definito.Elimina sul posizionamento nuovo

int* x = new int[2]; 
char* ch = new(x) char(); 
*ch = 't'; 
delete ch; 

Ma se il blocco di memoria, invece di heap viene allocata sulla pila e poi noi chiamiamo delete su quella variabile e poi accedere alla memoria, ottengo un'eccezione che il tipo blocco è valido.

int x[2]; 
char* ch = new(x) char(); 
*ch = 't'; 
delete ch; 

Così la lista delle domande è:

  • è l'eccezione a causa di chiamare di eliminare su una pila?
  • Va bene usare il posizionamento nuovo sul blocco di memoria nello stack?
  • In caso affermativo, come eliminare il puntatore del carattere.
  • È possibile assegnare più variabili su un singolo blocco della memoria utilizzando il nuovo inserimento?
+1

http://www.parashift.com/c++-faq/placement-new.html – Drax

risposta

16

L'eccezione dovuta alla chiamata di eliminazione su uno stack?

Sì. Anche se per chiarire un po ', questa non è un'eccezione C++. È un errore rilevato dal runtime. Se il runtime non è così intelligente, potresti anche imbatterti in comportamenti indefiniti.

Va bene utilizzare il posizionamento nuovo sul blocco di memoria nello stack?

Sì. Si potrebbe anche dare un'occhiata a alloca() e Variable-length arrays (VLA) - questi sono altri due meccanismi di allocazione della memoria in pila. Nota che VLA fa parte degli standard C99 e non C++ 11 (e precedenti), ma è supportato dalla maggior parte dei compilatori di produzione come un'estensione (potrebbe apparire in C++ 14).

In caso affermativo, come eliminare il puntatore del carattere.

Non si dovrebbe. Quando si utilizza un posizionamento nuovo, non si chiama delete, è sufficiente richiamare un distruttore. Per un dato oggetto o di tipo T è necessario chiamare o->~T(); anziché delete o;. Se è necessario, tuttavia, gestire il codice che chiama delete o delete [] su un oggetto di questo tipo, potrebbe essere necessario sovraccaricare gli operatori delete e delete[] e fare in modo che tali operatori non facciano nulla (il distruttore è già in esecuzione in quel punto).

È possibile assegnare più variabili su un singolo blocco di memoria utilizzando il nuovo inserimento?

Sì. Tuttavia, è necessario fare particolare attenzione per assicurarsi di soddisfare alignment requirements.

+0

Un'ottima risposta. ma solo 1 chiarimento.mentre si usa il posizionamento nuovo su una pila, la memoria viene allocata partendo dall'inizio e quindi spostandosi in avanti o allocando casualmente la memoria nel blocco specificato. sembra che la prima opzione sia corretta. correggimi se ho torto – Saksham

+0

@Saksham: Il nuovo posizionamento non ha assegnato alcun tipo di memoria. Usa la memoria specificata come argomento. Per quanto riguarda l'allocazione della memoria sullo stack, dipende dall'architettura, potrebbe crescere verso l'interno o l'esterno. Tuttavia, ogni singolo oggetto sullo stack avrà il suo indirizzo di base più basso, quindi se vuoi posizionare più oggetti con 'placement new []', alloca la memoria per loro in una volta. –

+0

Il mio male per la lingua errata per "memoria allocata". avrebbe dovuto essere "memoria utilizzata" – Saksham

Problemi correlati