2010-05-25 14 views
10

Supponiamo che io sono una classe C++ con un attributo che è un riferimento:Gli attributi di riferimento vengono distrutti quando la classe viene distrutta in C++?

class ClassB { 
    ClassA &ref; 
public: 
    ClassB(ClassA &_ref); 
} 

Naturalmente, il costruttore è definito in questo modo:

ClassB::ClassB(ClassA &_ref) : ref(_ref) { /* ... */ } 

La mia domanda è: quando un'istanza della classe ' ClassB 'viene distrutto, anche l'oggetto a cui fa riferimento' ClassB :: ref 'viene distrutto?

+1

Cosa intendi esattamente per "distrutto"? Basta chiamare il distruttore o anche rilasciare la memoria?Ad ogni modo, nessuna di queste cose accade :) – fredoverflow

risposta

13

Un riferimento non è altro che un alias per una variabile, l'alias viene distrutto, non la variabile effettiva. Potresti considerarlo una sorta di puntatore, ma ci sono ragioni per astenersi da questo tipo di pensieri (cattivi) :).

0

No; i riferimenti sono semplicemente una sintassi alternativa per i puntatori. Il valore a cui fanno riferimento non verrà modificato se il riferimento viene deallocato.

+6

I riferimenti non sono la sintassi alternativa per i puntatori. Sono alias per altri oggetti. Si potrebbe dire "nello stesso modo in cui i puntatori non cancellano ciò a cui puntano, i riferimenti non distruggono ciò che sono alias". – GManNickG

+0

Un puntatore è un indirizzo in memoria, dereferenziato dagli operatori '*' o '->'. Un riferimento è un indirizzo in memoria, dereferenziato dall'operatore '.'. Se non capisci in che modo puntatori e riferimenti sono fondamentalmente identici, non hai business in C++. –

+1

@John: Se vuoi indicarmi la posizione nello standard dove dice "I riferimenti sono sintassi alternativa per i puntatori", sii mio ospite. – GManNickG

2

No. Ecco perché è necessario un distruttore ~ClassB se ClassB è responsabile della memorizzazione di ref che potrebbe non essere.

+0

"che è dannatamente improbabile". – MSalters

+0

nel migliore dei mondi possibili;) – msw

-1

Non ho le specifiche C++ a portata di mano, ma la mia ipotesi è "No".

I puntatori non vengono cancellati automaticamente quando un oggetto viene distrutto, non vedo alcun motivo per cui un riferimento debba essere diverso. Inoltre, avere il riferimento automaticamente distrutto sarebbe maturo per bug interessanti.

0

Se vuoi che venga distrutto, dovrai incapsularlo (normalmente tramite puntatori "intelligenti", come std :: shared_ptr o std :: unique_ptr), che rilascerà automaticamente la memoria in modo appropriato su distruzione di B. I riferimenti nella lingua non hanno alcun comportamento di liberazione della memoria associato ad essi, eccetto la memoria reale del riferimento stesso, in contrapposizione al riferimento.

Dovrai costruire e capire il tuo modello di memoria. Le persone utilizzano in genere shared_ptr e il conteggio dei riferimenti per gli usi di base.

1

Quando un oggetto viene eliminato in C++, la sua memoria viene deallocata e quindi tutto ciò che è stato incorporato in esso (come le variabili membro) viene perso.

Nel caso di un puntatore, il puntatore è una variabile membro che contiene un indirizzo, quindi l'indirizzo è "distrutto" ma l'oggetto di riferimento, se presente, non lo è.

Nel caso di un membro di riferimento, l'indirizzo viene distrutto, ma la destinazione non è interessata.

Una classe può definire un distruttore che potrebbe definire comportamenti speciali. Un comportamento comune è quello di richiamare le operazioni di pulizia sui membri (se presenti) e di deallocare la memoria allocata dinamicamente in precedenza. Qui, tuttavia, hai già un oggetto quindi non dovresti essere tu a dirlo.

Problemi correlati