ぶら下がりポインタ、ワイルド ポインタ、NULL、nullptr

ここにディレクトリのタイトルを書きます

ぶら下がりポインタ

ダングリング ポインタは、破棄されたオブジェクトまたはリサイクルされたアドレスを指し、実行フェーズに表示されます。ダングリング ポインタは、次の状況で発生する可能性があります。

#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 0C++ では NULL が次のように定義されているためです。

#define NULL    0

したがって、NULL は曖昧であり、int 型またはポインタ型とみなすことができますこのあいまいさを解決するために、C++11 標準では、null ポインター定数としてキーワード nullptr を導入しています。nullptr は暗黙的にポインタ型に変換されますが、暗黙的に整数に変換することはできません。コンパイラは、仮パラメータがポインタである関数のバージョンを見つけて、NULL によって引き起こされる曖昧さを排除します。

おすすめ

転載: blog.csdn.net/TABE_/article/details/126632022