空悬指针、野指针、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 0,这是因为在​C++里面,NULL是这样定义的:​

#define NULL    0

因此,​NULL具有二义性,既可以被看做int类型,也可以当做一个指针类型。为了解决这种二义性,C++11标准引入了关键字nullptr作为空指针常量。​nullptr隐式转换为指针类型,而无法隐式转换为整形,编译器会找到形参为指针的函数版本,消除了NULL带来的二义性。

猜你喜欢

转载自blog.csdn.net/TABE_/article/details/126632022