Il seguente frammento di codice ha una perdita di memoria che ho passato troppo tempo a inseguirlo. Il problema è che all'interno di Foo(), la variabile locale x_ nasconde la variabile membro x_. È anche abbastanza fastidioso, perché il compilatore potrebbe avermi avvertito a riguardo. C'è una bandiera in GCC per un simile avvertimento? (Per i curiosi: Sono arrivato il codice buggy in primo luogo utilizzando una variabile locale, quindi modificando ad una variabile membro, ma dimenticando di rimuovere la dichiarazione di tipo.)Avviso sulla possibilità di nascondere le variabili membro?
struct A {
A() x_(NULL) {}
~A() {
delete x_;
}
void Foo() {
HugeThingy* x_ = new HugeThingy();
x_->Bar("I. Need. Garbage. Collection. Now.");
}
HugeThingy* x_;
DISALLOW_COPY_AND_ASSIGN(A); // Macro to prevent copy/assign.
}
Diverse persone hanno menzionato che si dovrebbe semplicemente usare un oggetto stringa semplice anziché un puntatore e un'allocazione dinamica - e hanno ragione. Se (come sospetto) in realtà vuoi sapere come ottenere il compilatore per avvisarti quando dichiari una variabile locale che nasconde una variabile membro, ti suggerirei di chiarire la tua domanda. –
Dato che si dispone del puntatore come variabile membro, ricordarsi di fornire l'operatore Copia costruttore e Assegnazione. –
Se non li forniscono, almeno sopprimono i valori predefiniti. –