『高品質C++/Cプログラミングガイド』の根絶「野指針」
「野ポインタ」はNULLポインタではなく、「ゴミ」メモリへのポインタです.一般的にNULLポインタを誤用することはありません.if文で判断しやすいからです.しかし、「野ポインタ」は危険で、if文は役に立たない.
「野指針」の成因は主に2つあります.
1ポインタ変数は初期化されていません.任意のポインタ変数は作成されたばかりのときに自動的にNULLポインタにはなりません.デフォルト値はランダムで、むやみに指を指します.したがって、ポインタ変数は作成と同時に初期化されるべきであり、ポインタをNULLに設定するか、合法的なメモリを指すようにします.たとえば
2
ししん
pはfreeやdeleteにされた後、NULLに置かれず、pと勘違いさせられる
合法的な指針です.参照
7.5
セクション.
3ポインタ操作は変数の作用範囲を超えている.このような状況は防ぎきれない.例のプログラムは以下の通りである.
関数Testは文p->Func()を実行するとオブジェクトaが消え,pはaを指すのでpは「野ポインタ」となる.しかし、不思議なことに、私はこのプログラムを実行してもエラーがありません.これはコンパイラと関係があるかもしれません.
「野指針」の成因は主に2つあります.
1ポインタ変数は初期化されていません.任意のポインタ変数は作成されたばかりのときに自動的にNULLポインタにはなりません.デフォルト値はランダムで、むやみに指を指します.したがって、ポインタ変数は作成と同時に初期化されるべきであり、ポインタをNULLに設定するか、合法的なメモリを指すようにします.たとえば
char *p = NULL;
char *str = (char *) malloc(100);
2
ししん
pはfreeやdeleteにされた後、NULLに置かれず、pと勘違いさせられる
合法的な指針です.参照
7.5
セクション.
3ポインタ操作は変数の作用範囲を超えている.このような状況は防ぎきれない.例のプログラムは以下の通りである.
class A
{
public:
void Func(void){ cout << “Func of class A” << endl; }
};
void Test(void)
{
A *p;
{
A a;
p = &a; // a
}
p->Func(); // p “ ”
}
関数Testは文p->Func()を実行するとオブジェクトaが消え,pはaを指すのでpは「野ポインタ」となる.しかし、不思議なことに、私はこのプログラムを実行してもエラーがありません.これはコンパイラと関係があるかもしれません.