2009-05-26 17 views
8

El siguiente fragmento de código tiene una pérdida de memoria que pasé demasiado tiempo persiguiendo. El problema es que dentro de Foo(), la variable local x_ oculta la variable miembro x_. También es bastante molesto, porque el compilador podría haberme advertido al respecto. ¿Hay una bandera en GCC para tal advertencia? (Para los curiosos: He llegado al código erróneo usando primero una variable local, a continuación, cambiar a una variable miembro, pero olvidando para eliminar la declaración de tipo.)¿Advertencia sobre la ocultación de variables de miembro?

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

Varias personas han mencionado que debe utilizar simplemente un objeto de cadena simple en lugar de un puntero y una asignación dinámica, y tienen razón. Si (como sospecho) realmente quieres saber cómo hacer que el compilador te advierta cuando declaras una variable local que oculta una variable miembro, te sugiero aclarar tu pregunta. –

+3

Como tiene el puntero como variable miembro, recuerde proporcionar el constructor Copia y el operador Asignación. –

+2

Si no los proporciona, al menos suprima los valores predeterminados. –

Respuesta

24

Uso -Wshadow.

Por cierto, ni -W ni -Wall habilita -Wshadow.

Es bueno tener el compilador para ayudar a evitar este tipo de problema, pero eso ni siquiera será necesario si utiliza convenciones que ayudan a evitar crearlo en primer lugar, tales como reservar nombres del formulario x_ para variables de miembro, no variables locales

+2

+1. Usted * incluso * respondió la pregunta real que se le hizo. –

+0

Me parece que OP tiene esa convención, pero ha tenido un "thinko" y ha escrito "string * x_ =" en lugar de "x_ =" que en realidad se pretendía. –

+2

En mi humilde opinión, es mucho mejor que su editor destaque las variables locales y miembros de formas contrastadas de lo que es agregar una verruga húngara al nombre. – rmeador

5

FWIW No tendría este problema porque utilizo una convención de nomenclatura para distinguir los datos de miembros de las variables locales: mis identificadores de datos de miembro invariablemente tienen el prefijo m_.

+1

+1, convención muy común. –

+0

Tampoco es una convención poco común para las funciones de miembros privados. Ayuda a atrapar rápida y claramente en un segundo lo que es privado. – mloskot

+1

Y nadie que trabaje en el código alguna vez ha cometido un error de copiar y pegar? Guau. – danio

0

Utilizamos estas verrugas en los inicios de nombres - a_ argumento miembro de datos d_ datos estáticos de la clase s_ f_ datos estáticos en el archivo

... y sin verruga para las variables locales.

En verdad, el libro de Lakos es tu amigo.

Cuestiones relacionadas