基础
1. 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的),此时去解引用就是去访问了一个不确定的地址,所以结果是不可知的。
2. 垂悬指针(迷途指针),在指针被delete之后,此时指针被称为空悬指针或者垂悬指针,也叫迷途指针。
索引
1. 段错误:一句话来说,段错误是指访问的内存超出了系统给这个程序所设定的内存空间,例如访问了不存在的内存地址、访问了系统保护的内存地址、访问了只读的内存地址等等情况。
2. 同一块内存释放两次,会造成内存错误,程序运行崩溃,显示“已放弃”字样。
3. 垂悬指针的测试
注意点:
1. 测试中,野指针可以“读”,不可以赋值,读不会段错误,赋值会段错误。
2. 测试发现,访问垂悬指针不发生段错误,甚至可以重新赋值,重新使用。可能是因为这一块内存还没有分配出去。
3. 内存释放后,数据会清除吗?测试,输出为空,说明数据清除了。
4. 测试发现“写野指针”(为野指针指向赋值)会出现段错误,读不会;而垂悬指针,可以正常使用没有报错。推测:可能是因为这一块内存还没有分配出去。
———————————————————————————————————————
1. 段错误,野指针
1.1 去“读”野指针,并没有段错误。
void test_26_02(){
int *p;
printf("*p=%d\n",*p);
printf("p=%p\n",p);
}
输出结果:
*p=-1991643855
p=0x400650
1.2 野指针赋值,发生段错误。
void test_26_02(){
int *p;
printf("*p=%d\n",*p);
printf("p=%p\n",p);
*p =2;
printf("*p=%d\n",*p);
printf("p=%p\n",p);
}
输出结果:
*p=-1991643855
p=0x400650
段错误
2. 同一块内存释放两次,会造成内存错误,程序运行崩溃,显示“...已放弃”。
2.1 代码
void test_26_02(){
char *p = (char *)malloc(2);
free(p);
free(p);
}
2.2 执行结果
2.3 代码
void test_26_02(){
int *p = new int[1];
delete []p;
delete []p;
}
2.4 执行结果
3. 测试垂悬指针
void test_00_01(){
char *p1 = new char[10];
strcat(p1,"hello");
printf("p1=%s\n",p1);
printf("p1=%p\n",p1);
delete []p1;//delete对象后,指针没置空,称为垂悬指针(迷途指针)
printf("*p1=%c\n",*p1);//内存释放后,数据会清除吗?测试,输出为空
printf("*****************\n");
strcat(p1,"world");//内存释放后,指针还可以用吗,测试是可以的,地址还是原来的地址。
printf("p1=%s\n",p1);
*p1 = 'c';//指针还能使用
printf("*****************\n");
printf("p1=%s\n",p1);
printf("*p1=%c\n",*p1);
printf("p1=%p\n",p1);
printf("*****************\n");
*(p1+20) = 'h';//可以访问,其他的堆内内存吗,测试是可以的。
printf("*(p1+20)=%c\n",*(p1+20));
}
3.1 测试垂悬指针 执行结果