2009-05-26 12 views
8

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. 
} 
+1

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. –

+3

Dato che si dispone del puntatore come variabile membro, ricordarsi di fornire l'operatore Copia costruttore e Assegnazione. –

+2

Se non li forniscono, almeno sopprimono i valori predefiniti. –

risposta

24

Usa -Wshadow.

A proposito, né -W né -Wall abilita -Whadows.

È utile che il compilatore aiuti a evitare questo tipo di problema, ma ciò non sarà nemmeno necessario se si utilizzano le convenzioni che consentono di evitare di crearlo in primo luogo, ad esempio prenotando i nomi del modulo x_ per le variabili membro, non variabili locali.

+2

+1. Tu * perfino * hai risposto alla domanda vera e propria che ti è stata posta! –

+0

Mi sembra che OP abbia una tale convenzione, ma ha avuto un "thinko" e ha digitato "string * x_ =" invece di "x_ =" che era in realtà inteso. –

+2

IMHO, è molto meglio che il tuo editor evidenzi le variabili locali e membro in modi contrastanti piuttosto che aggiungere una verruca ungherese al nome. – rmeador

5

FWIW Non avrei questo problema perché uso una convenzione di denominazione per distinguere i dati dei membri dalle variabili locali: i miei identificatori di dati dei membri sono invariabilmente preceduti da m_.

+1

+1, convenzione molto comune. –

+0

Non è nemmeno una convenzione per le funzioni dei membri privati. Aiuta a catturare rapidamente e chiaramente in un secondo ciò che è privato. – mloskot

+1

E nessuno che sta lavorando sul codice ha mai fatto un errore di copia e incolla? Wow. – danio

0

usiamo queste verruche sulle inizi di nomi - a_ argomento membro dati d_ dati s_ statici in dati statici della classe F_ nel file

... e non verruca per le variabili locali.

Veramente, il libro di Lakos è tuo amico.

Problemi correlati