ここにディレクトリのタイトルを書きます
ぶら下がりポインタ
ダングリング ポインタは、破棄されたオブジェクトまたはリサイクルされたアドレスを指し、実行フェーズに表示されます。ダングリング ポインタは、次の状況で発生する可能性があります。
#include <stdlib.h>
void func()
{
char *dp = (char *)malloc(A_CONST);
free(dp); //dp变成一个空悬指针
dp = NULL; //dp不再是空悬指针
/* ... */
}
上記の例は、free または delete が呼び出されたときに、動的に割り当てられたメモリを解放することに加えて、ダングリング ポインタを避けるために関連するポインタが NULL を指す必要があることを思い出させます。
ワイルドポインター
ワイルド ポインタは初期化されていないポインタであり、コンパイラによってランダムに割り当てられる可能性があります。
int func()
{
char *dp;//野指针,没有初始化
static char *sdp;//非野指针,因为静态变量会默认初始化为0
}
したがって、生のポインタを使用する場合は初期化する必要があります。
NULL と nullptr
NULL と nullptr の違いについて説明する前に、コードの一部を見てみましょう。
#include "stdafx.h"
#include <iostream>
using namespace std;
void func(void *p)
{
cout << "p is pointer " << p << endl;
}
void func(int num)
{
cout << "num is int " << num << endl;
}
int main(void)
{
void *p = NULL;
func(p);
func(NULL);
func(nullptr);
return 0;
}
実行結果は以下の通りです。
func(NULL)
実行結果は、num is int 0
C++ では NULL が次のように定義されているためです。
#define NULL 0
したがって、NULL は曖昧であり、int 型またはポインタ型とみなすことができます。このあいまいさを解決するために、C++11 標準では、null ポインター定数としてキーワード nullptr を導入しています。nullptr は暗黙的にポインタ型に変換されますが、暗黙的に整数に変換することはできません。コンパイラは、仮パラメータがポインタである関数のバージョンを見つけて、NULL によって引き起こされる曖昧さを排除します。