C++野ポインタインスタンス解析

1497 ワード

野ポインタ問題はC++プログラマーを悩ませる殺し屋の一人であり,本稿では野ポインタのケースを分析した.
  #include 'stdafx.h'  
    #include <iostream>  
    #include <string>  
    using std::cout;  
    using std::endl;  
    class Test  
    {  
    public:  
     Test()  
     {  
        a = 9;  
        delete this;  
     }  
     ~Test()  
     {  
      cout<<'destructor called!'<<endl;  
     }  
     int a;  
    };  
      
    int _tmain(int argc, _TCHAR* argv[])  
    {  
      Test *mytest = new Test(); //mytest   this            
      cout<<mytest->a<<endl;  
        return 0;  
    }  

       
すみません、運行結果はどうですか?
よくある答えは、プログラムが間違っていて、コンパイルに通じません.あるいはコンパイルにパスして、実行時にエラーが発生しました.Testクラスのコンストラクション関数がthisポインタを削除したので、Testクラスのコンストラクション関数を呼び出したことに相当し、オブジェクトが存在しなくなったので、メンバー変数aにアクセスする際にエラーが発生しました.
実際の結果,プログラムはコンパイルにより実行時にエラーを報告せず,aの値を9ではなくメモリ内のランダムなゴミ値で印刷することができる.
 
プログラムを実行中にエラーを発生させたい場合は、main関数をこのように書くことができます.
       Test mytest;        cout<このときmytestはローカルオブジェクトであり、スタックにメモリが割り当てられ、コンストラクション関数のdelete thisがスタックのメモリを解放しようとするため、エラーが発生します.
次のコードは、この状況を示しています.
       int a = 6;
       delete &a;//ランタイムエラー
以上の議論を続けると,野ポインタとはdeleteが動的オブジェクトを指すポインタを指した後,直ちにNULLに設定されず,そのポインタを参照解除するとゴミ値が発生する.
C++プログラマーにとって、野ポインタを徹底的に根絶するには、deleteがダイナミックオブジェクトを指すポインタの後、NULLに続く必要があります.したがって,ポインタを参照解除する前に,ポインタがNULLであるか否かを判断することができる.