一、free与delete把指针怎么了?
用free或delete 作用于指向堆内存的指针上,发生了什么?
它们只是把指针指向的内存释放掉,而并没有把指针本身释放掉,甚至连指针的值都没有改变。即,它们作用于指针,并没有改变指针指向的地址,而只是把该地址处的内存释放掉了,或者说该地址对应的内存是垃圾。
如:
char *p = (char *) malloc(100);
strcpy(p, “hello”);
free(p); // p 所指的内存被释放,但是p 所指的地址仍然不变
…
if(p != NULL) // 没有起到防错作用
{
strcpy(p, “world”); // 出错
}
另外注意:
用free或delete释放NULL指针完全没有问题,但连续释放非NULL指针会发生错误。
二、野指针:“野指针”不是NULL 指针,是指向“垃圾”内存的指针。
造成野指针的常见原因有三个:
1.定义指针时没有初始化;
2.指针指向栈内存中的变量,但该变量已经超过了其生存期;
3.指向堆内存的指针被delete或free作用后,却没有置为NULL。