1. 空指针常量
一个表示0值的整数常量,叫做空指针常量。例如:0,(void*)0,void* NULL
空指针常量可以赋值给任何指针类型,因为它是变体类型(void*)
更倾向于用NULL表示空指针常量
int *p = 0;
int *p = NULL;
2. NULL指针
NULL是一个标准规定的宏定义,用来表示空指针常量。在C++里面被直接定义成了整数立即数的0,而在没有__cplusplus定义的前提下,就被定义成一个值是0的 void* 类型的指针常量
数值为0的指针,C++标准规定,认为这个指针是空的。不要把空指针的内部实现表示等同于整数0的对象表示
空指针在虚拟内存中指向的是最下面的那段不可访问空间
野指针不是空指针,是指向垃圾内存的指针。
形成的原因:
-
在创建的时候没有被初始化。
-
指针被free或delete后,没有设置成NULL,让人误认为这是一个合法的指针
-
指针操作超越了变量的作范围
使用指针的注意事项:
- 定义指针时,要么初始化为NULL,要么指向一块合法的内存
- 用malloc申请内存后,要立即检查指针值是否为NULL。防止使用空值指针。
- 不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值引用。
- 动态内存的申请与释放必须配对,防止内存泄漏
- 用free或delete释放内存后,立即将指针置为NULL,防止成为空指针
3. void*
void*变体类型指针,如果将void*类型指针赋给其他类型指针,则需要强制转换;
int i = 10;
void* p = &i;
int* pp = (int*)p;
void*指针不可以解引用(取内容)
若要正确删除掉void*指向的动态类型变量,需要进行强制类型转换,否则会发生内存泄漏。
发生内存泄漏的原因在于,在delete的过程中,编译器并不知道该void*指向的什么类型的变量,就无法正确调用原类型的析构函数,只是简单地清空了一个指针。
参考链接:
https://zhuanlan.zhihu.com/p/400297706
下面这篇文章介绍了一个在回调函数中销毁传进来的void*会发生内存泄漏,需要在销毁时强制转换
https://zhuanlan.zhihu.com/p/163676489
标签:常量,int,void,空值,内存,NULL,指针 From: https://www.cnblogs.com/Yuqi0/p/17156209.html