首页 > 其他分享 >31.野指针和悬空指针

31.野指针和悬空指针

时间:2023-07-03 21:35:26浏览次数:27  
标签:p2 初始化 int 31 内存 悬空 指针

都是是指向无效内存区域(这里的无效指的是"不安全不可控")的指针,访问行为将会导致未定义行为。

●野指针
“野指针”(wild pointer):是没有被初始化过的指针,所以不确定指针具体指向。因为“野指针”可能指向任意内存段,因此它可能会损坏正常的数据,也有可能引发其他未知错误。在实际的程序开发中,定义指针时,一般都要尽量避免“野指针”的出现,可通过赋初值方式解决:

int main(void) 
{ 
    int* p;     // 未初始化
    std::cout<< *p << std::endl; // 未初始化就被使用
    
    return 0;
}

因此,为了防止出错,对于指针初始化时都是赋值为 nullptr,这样在使用时编译器就不会直接报错,产生非法内存访问。

●悬空指针
悬空指针,指针最初指向的内存已经被释放了的一种指针。

int main(void)
{ 
  int * p = nullptr;
  int* p2 = new int;
  
  p = p2;

  delete p2;
}

此时p和p2就是悬空指针,指向的内存已经被释放。继续使用这两个指针,行为不可预料。需要设置为p=p2=nullptr。此时再使用,编译器会直接保错。 避免野指针比较简单,但悬空指针比较麻烦。C++引入了智能指针,C++智能指针的本质就是避免悬空指针的产生。

产生原因及解决办法:

野指针:指针变量未及时初始化 => 定义指针变量及时初始化,要么置空。

悬空指针:指针free或delete之后没有及时置空 => 释放操作后立即置空。

标签:p2,初始化,int,31,内存,悬空,指针
From: https://www.cnblogs.com/codemagiciant/p/17524134.html

相关文章

  • 3.指针和引用的区别
    指针是一个变量,存储的是一个地址,需要占用存储空间;引用本质上是一个常量指针,引用跟原来的变量实质上是同一个东西,是原变量的别名指针可以有多级,引用只有一级指针可以为空,引用不能为NULL(必须有具体实体)指针声明和定义可以分开,可以先只声明指针变量而不初始化,等用到时再指向具体......
  • 7.区别以下指针类型?
    int*p[10]int(*p)[10]int*p(int)int(*p)(int)int*p[10]表示指针数组,强调数组概念,是一个数组变量,数组大小为10,数组内每个元素都是指向int类型的指针变量。int(*p)[10]表示数组指针,强调是指针,只有一个变量,是指针类型,不过指向的是一个int类型的数组,这个数组大小是10。i......
  • P3133 [USACO16JAN] Radio Contact G 无线电通话
    P3133[USACO16JAN]RadioContactG无线电通话目录P3133[USACO16JAN]RadioContactG无线电通话[USACO16JAN]RadioContactG题目描述输入格式输出格式样例#1样例输入#1样例输出#1提示思路后记题目传送门[USACO16JAN]RadioContactG题目描述FarmerJohnhaslost......
  • 指针模板
    下文所提到的函数的用法:birnary_search:查找某个元素是否出现,return值为boolbinary_search(beg,end,val)查找val,找到为1,否则为0;lower_bound:查找第一个>=某个元素的位置lower_bound(beg,end,val)返回一个迭代器,指向非递减序列中第一个>=val的位置upper_bound:查找第一个>......
  • P5731
    https://www.luogu.com.cn/problem/P5731这道题被标为红题,真实难度应该介于红题和橙题之间,问题在于我高估了它的难度,以为至少有橙题的难度,一般不打表的我毫不犹豫选择了用dfs解决此题,倒也没用太多时间,也完全正确,只不过做完题后打开题解发现只要用四五个while就能解决这个问题,我这......
  • C语言笔记:第10章 数组和指针
    数组:https://www.cnblogs.com/mjios/archive/2013/03/15/2961147.html指针:https://www.cnblogs.com/mjios/archive/2013/03/16/2963645.html ......
  • 将以%号开头的gb2312编码转化为汉字
    解码importurllib.parsemao='%C3%AB%CF%FE%CD%AE'#此编码格式为gb2312mao=urllib.parse.unquote(mao,encoding='gb2312')#urllib.parse.unquote()的默认编码格式为‘utf-8’print(mao)guan='%E5%85%B3%E6%99%93%E5%BD%A4'......
  • P7316 [COCI2018-2019#3] NLO
    考虑延续GDKOI普及组签到题的做法。先枚举\((x,y)\)考虑他会更新哪些节点,那么这个在GDKOI上是体现在一个差分上面。这里\(n\)很大而\(k\)很小,那么我们就可以考虑枚举\(n\)和\(k\),但是使用线段树来做。但是注意到一个事情,我们做区间赋值附的不是简单的$0/1$......
  • C++ 核心指南之资源管理(下)—— 智能指针最佳实践
    C++核心指南(C++CoreGuidelines)是由BjarneStroustrup、HerbSutter等顶尖C+专家创建的一份C++指南、规则及最佳实践。旨在帮助大家正确、高效地使用“现代C++”。这份指南侧重于接口、资源管理、内存管理、并发等High-level主题。遵循这些规则可以最大程度地保证静......
  • assert断言与const修饰指针的妙用(模拟实现strcpy函数)
     assert断言目录assert断言的妙用:头文件:使用方法:const修饰指针的妙用主要用法const在*左边const在*右边断言和const修饰指针的应用模拟实现C语言strcpy函数  1、若字符串str1,str2有空指针怎么办?  2.str2改变了怎么办?assert断言的妙用:头文件:#include<assert.h>使用方法:当......