空悬指针(dangling pointer)
指向已经销毁的对象或已经回收的地址,以下情况可能出现空悬指针:
#include <iostream>
int main(){
char *d = NULL;
{
char c = 'c';
d = &c;
}
//变量c释放,d变为空悬指针
}
#include <iostream>
#include <cstring>
int main(){
char *d = (char *)malloc(sizeof(char));//申请
free(d); //d指针空间被释放,d为空悬指针
d = NULL; //d不再是空悬指针
}
//当free或者delete调用时,除了释放动态申请的内存,还要将相关的指针指向NULL,避免出现空悬指针。
#include <iostream>
#include <cstring>
int *fun(){
int num = 123;
return #
}
int main(){
int *p = fun();
std::cout<< *p;
}
//num是基于栈的变量,当func函数返回时,变量的空间将被回收,此时获得的指针指向的空间右可能被覆盖。
野指针:
没有初始化的指针,称为野指针,通常编译器会报错。
#include <iostream>
#include <cstring>
int main(){
char *dp;//野指针,没有初始化
static char *sdp;//非野指针,因为静态变量会默认初始化为0
}
-
指针变量没有被初始化(如果值不定,可以初始化为NULL)
-
指针被free或者delete后,没有置为NULL, free和delete只是把指针所指向的内存给释放掉,并没有把指针本身干掉,此时指针指向的是“垃圾”内存。释放后的指针应该被置为NULL.
-
指针操作超越了变量的作用范围,比如返回指向栈内存的指针就是野指针。