2012-12-27 12 views
6

Se hopuntatori - duplicare istanza dell'oggetto

Class *a1 = new Class(); 
Class *b1 = a1; 

delete b1; 
delete a1; //this will give a double free or corruption message; 

se elimino puntatore b, è la stessa come l'eliminazione di puntatore un diritto? Poiché i due puntano alla stessa istanza di Class. Quindi, come posso copiare l'istanza di a1 in b1 in modo che quando elimino b1, a1 NON sia cancellato.

Class *a1 = new Class(); 
Class *b1 = a1; 

//how do I duplicate the instance a1 is pointing 
//so that when I delete b1, a1 still exists. 

delete b1; 
delete a1; //this is still valid 

Grazie.

+1

Non sono sicuro che tutti i puntatori siano necessari, ma "Classe * b1 = nuova classe (* a1);" dovrebbe farlo. – chris

+0

Assicurati che il tuo costruttore di copia sia OK e crea una nuova copia da * a1. – halfelf

+0

È stato facile @. @ Grazie – tambalolo

risposta

10

C'è un motivo per cui si stanno utilizzando i puntatori e l'assegnazione? Altrimenti è semplice come

Class a1; 
... 
Class b1 = a1; 

Qui non è necessario eliminare.

Se è necessario mantenere la struttura in quanto è quello che devi fare

Class *a1 = new Class(); 
Class *b1 = new Class(*a1); 

o

Class *a1 = new Class(); 
Class *b1 = new Class(); 
*b1 = *a1; 

Questo presuppone che un costruttore di copia valida (ad esempio # 1) o la cessione dell'operatore (es. # 2)

ps: prova a utilizzare std::unique_ptr invece di puntatori grezzi per essere più sicuri.

+2

Cosa succede se qualcun altro ha scritto Class e non hanno aggiunto il copy-constructor o l'operatore di assegnazione? – corro