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