首页 > 其他分享 >空值指针和void*指针

空值指针和void*指针

时间:2023-02-26 10:35:08浏览次数:44  
标签:常量 int void 空值 内存 NULL 指针

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的对象表示

空指针在虚拟内存中指向的是最下面的那段不可访问空间

野指针不是空指针,是指向垃圾内存的指针。

形成的原因:

  1. 在创建的时候没有被初始化。

  2. 指针被free或delete后,没有设置成NULL,让人误认为这是一个合法的指针

  3. 指针操作超越了变量的作范围

使用指针的注意事项:

  1. 定义指针时,要么初始化为NULL,要么指向一块合法的内存
  2. 用malloc申请内存后,要立即检查指针值是否为NULL。防止使用空值指针。
  3. 不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值引用。
  4. 动态内存的申请与释放必须配对,防止内存泄漏
  5. 用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

相关文章

  • 时间击败100%用户的快慢指针删除链表中的倒数第n个节点算法
    //给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 ///***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNoden......
  • error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already def
    环境WIN10+VS2010。之前写代码时,需要调用windowsAPI,引用了#include<windows.h>。接下来为了返回CString,引用了#include<afxwin.h>。第一次报错:error :  Building ......
  • 数组和指针
    一维数组和指针先回忆一下,数组是由一系列类型相同的元素组成。如:charch[4];/*4个字符的数组*/intin[4];/*4个整数的数组*/floatfl[4];/*4个浮点数的数......
  • Java中的void 关键字
    每次定义一个方法的时候需要定义是否需要返回值 比如赋值的方法 是一个给的过程 不需要返回值 void出现publicvoidsetName(Stringname){this.nam......
  • 07. 指针
    一、指针的相关概念1.1、地址与指针与变量  内存区的每一个字节都有一个编号,这就是“地址”。如果在程序中定义了一个变量,在对程序进行编译或运行时,系统就会给这个变量......
  • C语言指针错误
    以下指针代码出现的错误,因该是第二个for循环格式使用了逗号导致代码出现紊乱,但是在调试代码却没有报错。知道的回复一下。intmain(){ int*p,i,a[10]; p=a; for(i......
  • 智能指针
    原理:智能指针是一个类,用来存储指向动态分配对象的指针,负责自动释放动态分配的对象,防止堆内存泄漏。动态分配的资源,交给一个类对象去管理,当类对象声明周期结束时,自动调用......
  • Python 处理数据集中的空值
    在Python中,可以使用多种方法处理数据中的空值,以下是一些常见的处理方法:1、删除空值:可以使用pandas库中的dropna方法删除数据中的空值,例如:importpandasaspddf=pd.re......
  • 有序数组的平方(双指针)
    题目:给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。示例1:输入:nums=[-4,-1,0,3,10]输出:[0,1,9,16,100]解......
  • Mockito mock 静态 void 方法
    MockedStatic<SpringContextUtils>utils=Mockito.mockStatic(SpringContextUtils.class);utils.when(()->SpringContextUtils.publishEvent(any())).......