クラス > メンバー関数内でクラスをnewしていないことの確認


TErrorLoggerというクラスを作っている時に疑問が生じました。

`TErrorLogger *testError = new TErrorLogger();`  
とするところを  
`TErrorLogger *testError;`  
としていたとします。

このまま  
`testError->Add()`のようなメンバ関数を呼ぶとエラーになりますが、`testError::Add()`内でそれを判別する方法はどういうものがあるでしょうか?

自分が試したのは以下の方法です。環境はC++ Builder XE4です。

[code]

    void TErrorLogger::Add(){
      if (this == NULL) {
        return; // error
      }
    }
    
[/code]

上記のような方法は正しいでしょうか？  
他のtestError未初期化の判別方法がありましたらご教授ください。




`Add()` 内部からでは無いです。  
[c](/questions/tagged/c "'c' のタグが付いた質問を表示") [c++](/questions/tagged/c%2b%2b
"'c++' のタグが付いた質問を表示") の言語仕様上、未初期化の自動変数は不定値です。 `NULL` とは限りません。

対策1．コンパイラ/静的解析ツールに検出してもらう  
多くのコンパイラ/静的解析ツールで未初期化の自動変数の使用を検出できるはずです。  
警告メッセージを得るには警告レベルを上げる必要があるかもしれません。

[code]

    int func() {
        int* p;
        return *p;
    }
    
    $ g++ -c -Wuninitialized uninit.cpp
    uninit.cpp:3:12: warning: 'p' is used uninitialized in this function [-Wuninitialized]
    
[/code]

~~対策2．生ポインタを使うのをやめましょう  
`shared_ptr` とかのスマートポインタを使うと `new` を忘れるとコンパイルエラーになります。~~

対策3．そもそも `new` をやめましょう  
その `new` 本当に必要ですか？  
普通に `TErrorLogger log;` と書ける文脈ならば `new` しなきゃいいんです。




`Add()` 内部からでは無いです。  
[c](/questions/tagged/c "'c' のタグが付いた質問を表示") [c++](/questions/tagged/c%2b%2b
"'c++' のタグが付いた質問を表示") の言語仕様上、未初期化の自動変数は不定値です。 `NULL` とは限りません。

対策1．コンパイラ/静的解析ツールに検出してもらう  
多くのコンパイラ/静的解析ツールで未初期化の自動変数の使用を検出できるはずです。  
警告メッセージを得るには警告レベルを上げる必要があるかもしれません。

[code]

    int func() {
        int* p;
        return *p;
    }
    
    $ g++ -c -Wuninitialized uninit.cpp
    uninit.cpp:3:12: warning: 'p' is used uninitialized in this function [-Wuninitialized]
    
[/code]

~~対策2．生ポインタを使うのをやめましょう  
`shared_ptr` とかのスマートポインタを使うと `new` を忘れるとコンパイルエラーになります。~~

対策3．そもそも `new` をやめましょう  
その `new` 本当に必要ですか？  
普通に `TErrorLogger log;` と書ける文脈ならば `new` しなきゃいいんです。

