首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么不删除将指针设置为NULL?

在C++或C语言中,将指针设置为NULL(或者在C++11中使用nullptr)是一种很常见的做法。这是因为将指针设置为NULL可以避免悬空指针的出现,并有助于防止因为使用未初始化或已释放的指针而导致的程序错误。

悬空指针是指一个指针指向的对象已经被释放,但指针本身并没有被设置为NULL。这样的指针被称为悬空指针,它可能导致程序错误,因为它试图访问一个已经不存在的对象。将指针设置为NULL可以避免这种情况的发生。

此外,将指针设置为NULL还可以帮助代码的可读性和可维护性。当其他开发人员看到一个指针被设置为NULL时,他们可以清楚地知道该指针目前没有指向任何对象。这也有助于防止因为误解指针的指向而导致的程序错误。

总之,将指针设置为NULL是一种良好的编程习惯,可以帮助避免程序错误并提高代码的可读性和可维护性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么 MySQL 不推荐默认值为 null ?

NULL值是一种对列的特殊约束,我们创建一个新列时,如果没有明确的使用关键字not null声明该数据列,MySQL会默认的为我们添加上NULL约束。...有些开发人员在创建数据表时,由于懒惰直接使用Mysql的默认推荐设置.(即允许字段使用NULL值).而这一陋习很容易在使用NULL的场景中得出不确定的查询结果以及引起数据库性能的下降。...IS NULL IS NOT NULL 太空船操作符,这个操作符很像=,select NULLNULL可以返回true,但是select NULL=NULL返回false....虽然select NULL=NULL的结果为false,但是在我们使用distinct,group by,order by时,NULL又被认为是相同值. 1 (root@localhost mysql3306...根据以上缺点,我们并不推荐在列中设置NULL作为列的默认值,你可以使用NOT NULL消除默认设置,使用0或者''空字符串来代替NULL。 ---- ----

3.9K20

为什么 MySQL 不推荐默认值为 null ?

NULL值是一种对列的特殊约束,我们创建一个新列时,如果没有明确的使用关键字not null声明该数据列,MySQL会默认的为我们添加上NULL约束。...有些开发人员在创建数据表时,由于懒惰直接使用Mysql的默认推荐设置.(即允许字段使用NULL值).而这一陋习很容易在使用NULL的场景中得出不确定的查询结果以及引起数据库性能的下降。...IS NULL IS NOT NULL 太空船操作符,这个操作符很像=,select NULLNULL可以返回true,但是select NULL=NULL返回false....虽然select NULL=NULL的结果为false,但是在我们使用distinct,group by,order by时,NULL又被认为是相同值. 1 (root@localhost mysql3306...根据以上缺点,我们并不推荐在列中设置NULL作为列的默认值,你可以使用NOT NULL消除默认设置,使用0或者''空字符串来代替NULL。

4.9K30
  • MySQL 字段强烈不建议设置 null 为默认值

    NULL 值对于索引非常不友好。可空列被索引后,每条记录都需要一个额外的字节,还能导致MyISAM中固定大小的索引变成可变大小的索引。使用 NULL 值可能导致查询结果的不确定性。...= 等负向条件时,如果存在 NULL 值,查询结果也会为空。对于程序员编写业务代码出现空指针的概率大大增加。对于查询报表的情况下,NULL 值非常容易造成 SQL 编写后数据库不准确的情况。...如果列允许为 NULL,索引可能不存储 NULL 值,这可能导致查询结果不包含这些记录。使用 COUNT() 函数时,NULL 值不参与统计,可能导致业务数据不准确。...字符串类型可以设置为空字符串,int 类型可以设置为 -1 或其他

    3810

    【数据结构】顺序表和链表

    位置之后的值 // 分析思考为什么不删除pos位置?...在链表接口声明中,下面将进行一一的实现。...;//设置该指针变量唯一目的就是,为了是新的尾节点的next置成NULL,防止成为野指针 while (cur->next !...tail->next = NULL;//别忘记置成NULL,防止对NULL造成访问 } } 尾删的整体思路和尾插是一样的,唯一的区别就在于多定义了一个tail指针变量,设置该指针变量唯一目的就是,为了是新的尾节点的...头删,建立一个临时的指针变量cur是一个关键,如果不建立,第一个节点已释放,找不到了之后的数据,把头指针指向第二个节点,那第一个节点的空间又无法释放,因此建立一个临时指针变量去存储其中一个地址,两个方法都可以

    11700

    DS:带头双向循环链表的实现

    1.3 循环或者不循环 不循环的链表最后一个结点的next指针指向NULL,而循环的链表,最后一个结点的next指针指向第一个结点!!...phead->prev = newnode;//哨兵结点的前驱指针指向新结点 } 单链表中我们的参数选择二级指针,为什么这里选择一级指针???...phead->next = newnode;//头节点的后继指针指向新节点 } 4.5 打印 因为是循环链表,所以为了避免死循环打印,我们要设置一个指针接收头节点的下一个结点,然后往后遍历...同时要注意一条规则,就是当链表中只有哨兵结点的时候,我们称该链表为空链表!因此如果链表只存在哨兵结点,那么删除是没有意义的,所以必须断言!...} 为什么phead=NULL没有用??

    12310

    【探索数据结构】线性表之单链表

    是否存在一种数据结构,能够解决以上顺序表表现出来的问题: 1)中间/头部的插入删除,可以一步到位,不需要挪动数据 2)不需要扩容 3)不会造成空间 答案是本篇主角——(单)链表 文章重点介绍:不带头节点不循环的单链表一...有单链表、双链表、循环链表优点:动态内存分配、插入和删除高效、空间利用率高缺点:访问元素效率低、有额外的空间开销、缓存不优好二、单链表1.概念单链表是一种线性数据结构,其中元素在逻辑上按照线性顺序排列,...2.分类(1)带头节点在单链表中,第一个节点之前通常有一个头指针(或称为头节点),它指向链表中的第一个数据节点。如果链表为空,则头指针通常指向空(NULL)。...链表的最后一个节点的指针域被设置为空(NULL),以表示链表的结束。(2)不带头节点不带头节点的单链表,我们直接通过头指针指向第一个数据节点,而不需要额外的头节点作为起始点。...next;}//新节点变为链表的新尾巴ptail->next = newnode;}}思考:为什么要用二级指针来接收实参?

    8600

    数据结构之双链表(超详解)

    为什么用一级指针接收呢? 保证哨兵位节点不能被删除(若被删除则不是双链表),节点的地址也不能发生改变,因此传一级最合适。...尾插、头插 尾插 首先,通过函数创建一个新节点,并将其数据域设置为输入的值x,得到新节点的指newnode。 设置新结点的指针以插入到尾部。...指定位置删除结点 删除指定结点,想要形参的改变影响到实参,那么传二级指针不是更好吗? 事实的确如此,那么我们为什么在这里是传一级指针呢? 目的是为了保证接口一致性。...需要注意的是:删除指定结点后,由于形参不能改变实参,因此需要我们手动置指定结点为NULL。 查找结点 和单链表一样,我们只需要遍历原链表查找结点,若没找到则返回NULL。...为了保证接口的一致性,这里同样采用传一级指针,需要手动置双链表的头结点为NULL。

    8910

    数据结构-队列

    队列是只允许在一端插入另一端删除的线性表,即一种先入先出(FIFO)的结构,队列有顺序对列与循环队列,循环队列主要是为了弥补队列存储空间不足与“假溢出”的问题,所以在实际应用时,往往使用的是循环队列,下面我们从头说下为什么会有循环队列这个东西...这个问题解决了,顺序链表的形式也就确定了,那么为什么还会有循环链表? ?...*/ return OK; } /* 若队列不空,则删除Q中队头元素,用e返回其值 */ Status DeQueue(SqQueue *Q,QElemType *e) { if...e的新结点s赋值给原队尾结点的后继,见图中① */ Q->rear=s; /* 把当前的s设置为队尾结点,rear指向s,见图中② */ return OK; } /* 若队列不空...② */ if(Q->rear==p) /* 若队头就是队尾,则删除后将rear指向头结点,见图中③ */ Q->rear=Q->front; free(p);

    57360

    DS:单链表实现队列

    2、为什么我要在队列结构体里设置一个size,不设置可以吗??    ...其实不设置size也是可以的,有些书上也没有设置size,我设置size也是考虑到2个原因: 1、栈有结构体成员top,而队列没有 栈中的top其实跟顺序表中的有效数据个数基本上差异不大,虽然名字是不一样的...必须不能是NULL,因此要分开讨论ptail为NULL的情况 2.3.3 为什么assert(pq->phead == NULL)      因为我们考虑ptail为空的时候,不能用成员next,但是因为按道理来说一般情况下...ptail成为一个野指针,所以我们需要考虑只有一个节点多个节点的情况 if (pq->phead->next == NULL)//一个节点的情况,直接将这个节点释放并置空即可 { free(pq...ptail成为一个野指针,所以我们需要考虑只有一个节点多个节点的情况 if (pq->phead->next == NULL)//一个节点的情况,直接将这个节点释放并置空即可 { free(pq

    16410

    链接未来:深入理解链表数据结构(一.c语言实现无头单向非循环链表)

    通过遍历找到最后一个节点(tail),并将其 next 指针指向新节点 newNode,以将新节点插入到链表的末尾 为什么传入二级指针: 这种设计方式的原因在于需要修改指针本身的值,而不是只修改指针所指向的内容...),然后将当前头节点的 next 指针指向新节点 newNode,以完成插入 注释部分显示了另一种写法,通过先设置新节点的 next 指针指向当前头节点,然后再将链表的头指针指向新节点,实现了同样的插入操作...*pphead 是否存在(不为 NULL),以及链表是否为空(只有一个节点) ​ 如果链表中只有一个节点,则直接释放该节点,并将链表头指针设置为 NULL,表示链表为空 如果链表中有多个节点,则会找到倒数第二个节点...它通过遍历链表直到找到倒数第二个节点 pre_tail,然后释放最后一个节点,并将倒数第二个节点的 next 指针设置为 NULL,表示该节点成为新的末尾节点 3.5头删 void SLPopFront...这是因为要删除的是链表的头节点,为了不断开链表,需要先保存第二个节点的地址 通过 free(*pphead) 释放掉原来的头节点,然后将链表的头指针 *pphead 更新为原头节点的下一个节点 first

    15310

    SkipList和java中ConcurrentSkipListMap的实现

    现在需要删除节点n。 第一步,使用CAS将n的valu的值从non-null设置为null。这个时候,任何外部的操作都会认为这个节点是不存在的。...但是那些内部的插入或者删除操作还是会继续修改n的next指针。 第二步,使用CAS将n的next指针指向一个新的marker节点,从这个时候开始,n的next指针将不会指向任何其他的节点。...this; this.next = next; } 我们可以看到marker节点实际上是一个key为null,value是自己的节点。...第三步,使用CAS将b的next指针指向f。从这一步起,n节点不会再被其他的程序访问,这意味着n可以被垃圾回收了。...我们思考一下为什么要插入一个marker节点,这是因为我们在删除的时候,需要告诉所有的线程,节点n准备被删除了,因为n本来就指向f节点,这个时候需要一个中间节点来表示这个准备删除的状态。

    52720

    【初阶数据结构】详解栈和队列(来自知识星空的一抹流光)

    如果你没有猜到,没关系,听我给你解释一下是为什么。 我们可以知道的一个信息就是:队列只能在一端进行插入操作,在另一端进行删除操作。...我在之前说过,实现队列的插入或者删除操作时,只要我们能够合理的控制头节点和尾节点的指针,就足以能够实现队列。那此时,我们就要想一下,能不能有个更简单的方式,一起控制着头指针和尾指针。...方法就是:将头节点的指针和尾节点的指针用一个结构体给打包起来,只要我们使用头节点和尾节点的指针时,就不要额外再定义其它变量了。...如果你不这样做的话,你再给函数传递参数时,你就得往函数里面多传递两个参数或者是每当进行删除或插入数据时,我们都得先定义两个变量分别代表头节点和尾节点,十分的繁琐!...如果觉得本文将的还不错的话,麻烦给偶点个赞吧!!!

    35210

    Android双端队列——ArrayDeque的实现&源码分析

    Arrays.fill(elements, null);//将原数组清空 elements = a;//将扩容后的数组赋给elements head = 0;//设置head...为0 tail = n;//设置tail为扩容前的数组大小,作为指针起点 } 逻辑解析: 计算出head指针右侧元素个数,之后需要使用它来进行数据复制。...将原数组元素都置位null。 将新数组赋给elements。 设置head的值为0,tail的值为原数组的大小n。这时,新数组的[0~n)指针位均已存储元素。...如果result不为null,将elements[t]置位null,并且将t赋值给tail指针。 最后返回result变量。...本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    88420

    数据结构初步(五)- 线性表之单链表的分析与C语言实现

    这种情况函数只需要知道外部头指针phead的值副本即可。 综合考虑这个函数参数设置为SLNode** pphead,接受外部头指针的地址。...函数需要得到外部头指针的地址&phead,即二级结构体指针SLNode** pphead。 将这个函数参数设置为SLNode** pphead,接受外部头指针的地址。...接口函数函数可以不进行操作而直接返回;也可以对头指针为NULL进行断言assert(),只有当头指针phead不为NULL时才继续删除操作。...接口函数函数可以不进行操作而直接返回(柔和检查);也可以对头指针为NULL进行断言assert()(暴力检查),只有当头指针phead不为NULL时才继续删除操作。...链表中只有一个节点,删除此节点之后链表为空,及时释放free()被删除节点空间,外部头指针phead此时需要改变指向(值),需要使其指向NULL;所以此情况我们需要二级结构体指针pphead接受外部头指针

    85910

    数据结构—线性表

    为什么会出现这种移动和删除某一元素时都需要移动大量的元素,是因为相邻两元素的存储位置也是具有相邻关系,他们在内存中的位置也是挨着的,中间没有空虚,不能直接进行插入,要想进行插入,需要先把其他元素进行挪动...头指针始终不等于NULL(指针是指指向下一个元素的的信息,当为NULL时,即不指向任何元素),head->next等于NULL的时候,链表为空。...不带头结点的单链表中的头指针head直接指向开始结点,当head等于NULL(head->=NULL)的时候,链表为空。...链表中整个链表的存取就必须从头指针开始进行,之后的每个结点就是上一个结点的后继指针指向的位置,最后一个结点(终端结点)的指针为空,通常用NULL或^表示。...//直到r指针指向为NULL } 2.查找结点的算法 在双链表中查找值为x的结点,如果找到,则返回该结点的指针,否则返回NULL值。

    69730

    java队列

    为什么不直接使用顺序表作为底层容器,因为入队操作执行顺序表尾插入,时间复杂度为O(1) O(1) 普通语句,相互操作,时间复杂度为O(1) 出对操作执行表头删除操作,时间复杂度为O(n),因为涉及到一个循环遍历...,移动,由于时间复杂度高,此时直接想方法将时间复杂度降低为O(1) ,即,用双指针解决。...即front和rear两个解决 时间复杂度 O(n) 涉及一层循环,此时时间复杂度为O(n) 又因为直接更改下标,会导致空间的浪费,(出队操作)此时,为了减少空间的浪费,将队列设计为循环队列,目的,避免假满现象的出现...,将会抛出错误,不会自动扩充 boolean offer(T data); // 返回队头元素,不执行删除操作,为空 返回null T peek(); // 返回队头元素,如果为空,将会抛出异常...T element(); // 出队,执行删除操作,若为空,返回null T poll(); // 出队,执行删除操作,若为空,抛出异常 T remove(); // 清空队列 void

    98500

    单例模式

    当定义一个对象时,比如MyCAS mycas;,编译器会自动在栈上为这个对象分配内存,并在离开当前作用域时自动释放这个内存。所以,我们不需要(也不能)手动删除这个对象。...我们将它初始化为NULL,表示这个指针目前不指向任何东西。...这里有个小坑,记得C++中小写的null是没有意义的 总的来说,将MyCAS* MyCAS::m_instance = NULL;写在类外面是C++语言规则的要求。...那紧接着,就会问,那为什么GetInstance()函数定义不写在类外面呢,它写在类里不会报错,毕竟它也是static 在C++中,成员函数(包括静态和非静态)的声明通常在类的定义中进行,而定义(也就是函数体的实现...反序列化是将序列化的数据恢复为对象的过程。通常,反序列化函数会根据序列化数据创建一个新的对象,并将其状态设置为序列化时的状态。 实际应用发现还是有缺点的,比如类里有指针的时候就不好搞了

    7610
    领券