这里写目录标题
空悬指针
空悬指针指向已经销毁的对象或已经回收的地址,出现于运行阶段。以下情况可能出现空悬指针:
#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带来的二义性。
文章评论