2009-05-26 10 views
8

次のコードスニペットでは、あまりにも多くの時間を追いかけてメモリリークが発生しています。問題は、Foo()の内部では、ローカル変数x_がメンバー変数x_を隠すことです。コンパイラがそれについて私に警告していたかもしれないので、それはかなり面倒です。そのような警告のためにGCCにフラグがありますか? (好奇心の場合:私は、メンバ変数にそれを変更する、最初のローカル変数を使用して、バグコードに到着するが、型宣言を除去するために忘れている)メンバ変数を隠すことについての警告?

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

何人かの人は、ポインタと動的割り当てではなくプレーンな文字列オブジェクトを使うべきだと言いました。あなたが実際にメンバー変数を隠すローカル変数を宣言したときに警告を出す方法を知りたいのであれば、あなたの質問を明確にすることをお勧めします。 –

+3

ポインタをメンバ変数として使用しているので、コピーコンストラクタと代入演算子を用意してください。 –

+2

これらを指定しない場合は、少なくともデフォルトを抑制してください。 –

答えて

24

使用-Wshadow。

ところで、-Wも-Wallも-Wshadowを有効にしません。

コンパイラがこの種の問題を回避するのはうれしいことですが、メンバー変数の場合はx_という名前の予約など、最初に作成しないようにする規則を使用する場合は、ローカル変数ではありません。

+2

+1。実際の質問にお答えしましたか? –

+0

OPにはこのような規則がありますが、実際に意図された "x_ ="の代わりに "thinko"とタイプされた "string * x_ ="があります。 –

+2

IMHO、あなたのエディタに、ハンガリーのいぼを名前に追加するよりも、対照的な方法でローカル変数とメンバ変数を強調表示する方がはるかに優れています。 – rmeador

5

FWIWメンバー変数とローカル変数を区別するために命名規則を使用しているため、この問題は発生しません。メンバデータ識別子は常にm_という接頭辞です。ファイル

の静的データA_引数 D_データメンバー クラスの S_静的データ F_を...とローカル変数のためのいぼ -

+1

+1、非常に一般的な慣習。 –

+0

また、プライベートメンバー関数では珍しいことでもありません。プライベートなものをすばやく正確にキャッチするのに役立ちます。 – mloskot

+1

そして、コードを扱っている人は誰もコピー&ペーストエラーを起こしたことはありませんか?ワオ。 – danio

0

私たちは、名前の始まりにこれらのいぼを使用していません。

本当に、ラコスの本はあなたの友人です。

関連する問題