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

为什么访问删除的指针不会使程序崩溃?

访问删除的指针不会使程序崩溃的原因是,删除一个指针只是将指针所指向的内存空间标记为可重用,而并没有真正释放该内存空间。因此,当访问已删除的指针时,程序仍然可以访问到该内存空间的内容,但这是一种未定义行为,可能会导致程序出现不可预测的错误。

在C++中,删除一个指针可以使用delete关键字,而在C语言中,可以使用free()函数。这些操作只是告诉操作系统可以重用该内存空间,但并不会立即清除或销毁该内存内容。

当访问已删除的指针时,可能会出现以下情况:

  1. 访问到无效的内存数据:已删除的指针所指向的内存空间可能已经被其他程序或操作系统使用,因此访问该内存可能会得到无效或随机的数据。
  2. 程序崩溃或异常行为:由于访问已删除的指针是一种未定义行为,程序可能会崩溃、产生段错误或导致其他异常行为。这是因为操作系统可能会检测到非法的内存访问并终止程序的执行。

为了避免访问已删除的指针导致程序崩溃或出现错误,开发人员应该养成良好的编程习惯,包括:

  1. 删除指针后将其设置为nullptrNULL:这样可以避免误用已删除的指针。
  2. 使用智能指针:智能指针是一种自动管理内存的指针,可以在不再需要时自动释放内存。使用智能指针可以避免手动删除指针的问题。
  3. 避免悬空指针:悬空指针是指已删除的指针仍然被使用的情况。在删除指针后,应该避免继续使用该指针或将其赋值给其他指针。

总之,尽管访问已删除的指针不会立即导致程序崩溃,但这是一种未定义行为,可能会导致程序出现错误或异常行为。因此,开发人员应该遵循良好的编程实践,避免访问已删除的指针。

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

相关·内容

为什么 CommonJS 会使程序包变大

在这篇文章中,我们将研究什么是 CommonJS,以及为什么会使 JavaScript 包变得那么大。 什么是 CommonJS?...服务器端 JavaScript 程序大小并不像浏览器中那样重要,这就是为什么 CommonJS 在设计时没有考虑到减小包大小原因。...JavaScript 打包和压缩程序(例如 webpack 和 terser)通过执行不同优化来减小应用程序大小。他们在构建时分析你程序,尝试尽可能多地删除那些没有用到代码。...要注意,即使你在 index.js 中用了 ES2015 规则,但是如果你用模块是 CommonJS 模块,则打包后大小也会受到影响。 为什么 CommonJS 使你程序包更大?...如果压缩程序处理上面的源代码,它将会: 删除未使用 subtract 和 index_subtract 函数 删除所有注释和多余空格 在 console.log 调用中内联 add 函数主体 开发人员经常将这种把删除未使用

94830

为什么 Redis 立刻删除已经过期数据?

实现过期机制一般思路从系统设计角度来说,过期之类机制可以考虑使用四种思路来实现。定时删除:是指针对每一个需要被删除对象启动一个计时器,到期之后直接删除。...定期删除:是指每隔一段时间就遍历对象,找到已经过期对象删除掉。针对这四种思路优缺点,你可以参考下面的表格。图片大部分缓存框架,比如 Redis,它们都使用了懒惰删除和定期删除结合策略。...Redis 定期删除要比我这里讲复杂很多,毕竟 Redis 是一个追求高性能中间件,所以肯定要有复杂机制控制住定期删除开销。为什么立刻删除?答案就是做不到,或者即便能做到,代价也太高。...总的来说,Redis 是通过控制执行定期删除循环时间来控制开销,这样可以在服务正常请求和清理过期 key 之间取得平衡。为什么要随机抽样,同一个 DB 内按照顺序遍历下去不就可以吗 ?...对于 RDB 来说,一句话总结就是主库不读写,从库原封不动。也就是说,在生成 RDB 时候,主库会忽略已经过期 key。在主库加载 RDB 时候,也会忽略 RDB 中已经过期 key。

2.3K31
  • 为什么说 ChatGPT 抢程序饭碗!

    用 5 种语言编写 21 个程序进行测试 在实验中,研究人员模拟了一个新手程序行为,要求聊天机器人生成相关程序代码。 然后研究人员向 ChatGPT 询问它所生成代码安全性。...根据实验,研究人员要求 ChatGPT 生成 21 个程序具体如下,其中每个程序本身比较简单,大多数程序是由一个单一类组成,甚至最长程序也只有 97 行代码: 程序 1:生成一个简单 C++ FTP...ChatGPT 互动后优化程序程序 6 显示 U 表示 ChatGPT 无法为此用例产生一个修正程序; 最后一栏(Executes)表示初始程序是否可以无错误地编译和运行。...当然,“我们判定一个程序是安全,我们也只是说,根据我们判断,该代码对于它所要测试攻击类别来说是脆弱。代码很有可能包含其他漏洞”,研究人员说道。...他们首先表明,如果仔细提示,ChatGPT 会产生不安全代码。然后,作者提出了开发人员可以用来指导 ChatGPT 生成安全硬件代码技术。

    29310

    996程序员们,为什么建议你买保险?

    996程序员们工作强度高、压力大,一旦患病,对家庭生活质量会产生极大威胁。 可以说,一人患上重疾,就等于一家人被判了死刑。 如何避免呢?很多人想到买保险,但我劝你不要着急买!...而那些花高价买万能险、返还险等,认为包括了“教育金”和“养老金”,不但有保障,还可以理财,很划算。但其实,这种保险价格比纯保障型贵好几倍,同样价格,保额也严重不足。...但很多人不知道,国家早已对各大保险公司疾病进行了统一,前25种重疾病种各家保险公司定义都是相同。 所以,我们看重数量应该是,重疾条款中附加轻症和中症项目。...要不然,我们花再多钱也是白搭,更得不到风险防御效果。 买保险4个正确打开方式 买保险各种不正确姿势,每天都在我们身边上演,这么深水,怎么才能避免被坑钱呢?...其实多花很多冤枉钱 有的朋友在代理人说服下很容易就买了一份“返还险”,认为到期了生病还可以返还保费,像是捡了一个大便宜。 但其实,这类保险是两全型保险,在寿险基础上附加一款重疾险。

    2.8K20

    程序猿硬核科普】Win系统下如何添加删除恢复桌面上“最近访问位置” | 如何自动清除最近访问位置

    本篇文章主要讲Win系统下如何添加/删除/恢复桌面上“最近访问位置” 以及如何自动清除最近访问位置。...一:添加/删除最近访问位置 添加(查看)最近访问位置很简单,打开我电脑 -- 收藏栏 -- “最近访问位置”,如下图: ? 或者在右键收藏夹 -- 还原收藏夹链接: ?...如何自动清除最近访问位置【文档浏览记录】 上面介绍了Windows7系统中“最近访问位置”功能,该功能可以快速打开上次打开文件夹,但是这个功能也可能会暴露我们隐私【尤其是...嘿嘿】,如何每次让系统自动删除最近访问位置信息呢...参考文章 1、删除桌面最近访问位置 https://zhidao.baidu.com/question/1990482534038643147.html 2、Win7系统下怎么删除桌面上“最近访问位置...【程序猿硬核科普】系列是利用晚上闲暇时间在半小时到一小时之内完成科普类型文章,有不明白就去搜资料,学习完就做笔记,旨在克服拖延症。文章可能多有疏漏之处,敬请指正!

    5.5K40

    为什么建议开发把OOM当成一种应用程序重启特性使用

    这些能力让开发减少了对运维相关属性关注,但也让一些开发把一些错误当成了特性来使用,比如针对一些无状态服务,利用 OOM 和自动重启来恢复。...一次OOM导致k8s节点卡死 最初现象:节点进入假死状态,登录节点上后ps等系统命令无法使用,节点监控看CPU、内存、负载情况: image.png image.png 可以看到节点CPU,内存没什么变化...,但负载和IO都变大了,可以推断大概率是内核和 IO 引起问题。...,算 Centos 一个内核bug,大家可能觉得系统人员去维护解决bug就行了,但是其实 OOM 引起系统故障bug 在 linux 各版本上都十分多,比如下面这个案例提到/proc/sys/...作为内核一个功能,如果把他本身作为一种特性去对待是十分危险

    86310

    【STL】vector使用

    : 一:构造一个空vector vector v;//定义一个元素为int类型空容器 二:构造含有n个val某类型容器,当指定val时,会默认初始化为0 vector v(10,1...2.3.1、迭代器 在string章节中就提到了迭代器相关概念,迭代器就是用一个对象,来模拟指针行为,实现对容器成员进行访问,是所有容器中通用方法。...如下所示:  2.3.2、关于迭代器失效问题 我们知道,迭代器就是用一个对象来模拟指针行为(++、--),从而实现对容器元素访问(*解引用)(string与vector在SGI版本下迭代器就是指针本身...迭代器失效意思就是指"指针"指向空间已经被销毁,即指针指向了一块已经被free空间。或者指向一块不属于它应该指向空间。如果此时对成员进行访问,即指针解引用操作,就会使程序崩溃。...这里简单举几个例子:  VS下对于任何迭代器失效处理,是直接报错,但是Linux下对有些迭代器失效引发问题处理并不会这么严格,就好像下面这种情况:  该情况也是属于迭代器失效,虽然程序没有崩溃

    17330

    【专业技术】你必须注意11个C++要点

    很显然,它们对C++程序员来说是永久好资料。我相信这一篇文章会使你收获不小。 首先,我把一些由不同层次C++程序员经常问问题归到一起。...当然,这条语法规则被认为是直观。首先,我们来看看什么是“逗号分离”表达形式。...要点7、避免产生内存碎片 经常会有这样情况:你应用程序每运行一次时就因为程序自身缺陷而产生内存漏洞而泄漏内存,而你又在周期性地重复着你程序,结果可想而知,它也会使系统崩溃。但怎样做才能预防呢?...要点8、是delete还是delete[] 在程序员中有个荒诞说法:使用delete来代替delete[]删除数组类型时是可以!...事实上,在一个平台上使用delete代替delete[]应用程序也许不会造成系统崩溃,但那纯粹是运气。

    98550

    C++程序员经常问11个问题

    很显然,它们对C++程序员来说是永久好资料。我相信这一篇文章会使你收获不小。   首先,我把一些由不同层次C++程序员经常问问题归到一起。...指向数据成员指针   尽管刚开始时,指向成员指针语法会使你有一点点迷惑,但你不久会发现它其实同普通指针差不多,只不过是*号前面多了::符号和类名字,例:定义一个指向int型指针: int...要点7、避免产生内存碎片    经常会有这样情况:你应用程序每运行一次时就因为程序自身缺陷而产生内存漏洞而泄漏内存,而你又在周期性地重复着你程序,结果可想而知,它也会使 系统崩溃。...要点8、是delete还是delete[]   在程序员中有个荒诞说法:使用delete来代替delete[]删除数组类型时是可以!   ...事实上,在一个平台上使用delete代替delete[]应用程序也许不会造成系统崩溃,但那纯粹是运气。

    86120

    【C++】内联函数

    为什么C++要引入内联函数? 频繁消耗栈帧函数 栈帧简单介绍: 当某个函数运行时,机器需要分配一定内存去进行函数内各种操作,这个过程中分配那部分栈称为栈帧。...当程序执行时,栈指针(栈顶)可以移动,因此大多数信息访问都是相对于桢指针。...也就是说,每当我们在C语言中调用函数时,栈上都需要开辟一定空间供我们使用,从汇编代码角度来看,如果是重复进行大量函数压栈操作,对于栈上空间消耗是巨大,极易导致栈溢出现象发生,进而导致程序崩溃,因此我们需要一些解决方法来防止这样错误产生...在编译阶段,会用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运行效率。...下图为《C++prime》第五版关于inline建议: inline建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。

    9610

    入门编程,一定要从C语言开始吗?

    而这么重要东西只能用C语言来写,所以C语言很重要。为什么只能用C语言写?第一,C语言速度够快;第二,C语言可以访问硬件,所以它够强大。 ? 为什么不能用 Java 写?...首先,Java 太慢了;其次,Java 语言没有指针。没有指针就不能访问硬件,所以它功能是不够指针是什么稍后会讲,它是C语言中非常重要内容。...这也是为什么C语言比较难学原因,因为学完之后编写一个程序很可能就是错,但又很难发现。所以前面说 C++ 从安全性上对C语言进行了升级。 ? 第二个是它开发周期比较长。...因为C语言是面向过程语言,面向过程语言一个特点就是写大项目的时候很容易“崩溃”。 当代码上到 10 万行时候很容易崩溃,会出现各种各样莫名其妙错误。...关于第一种编程语言,对于一名新手程序员来说,只要你选特别难,基本上没什么影响。(如java、python,但是前提又要参考上面所讲。)

    1.8K30

    美团一面:为什么线程崩溃崩溃不会导致 JVM 崩溃

    线程崩溃,进程一定会崩溃吗 进程是如何崩溃-信号机制简介 为什么在 JVM 中线程崩溃不会导致 JVM 进程崩溃 openJDK 源码解析 线程崩溃,进程一定会崩溃吗 一般来说如果线程是因为非法访问内存引起崩溃...,那么进程肯定会崩溃为什么系统要让进程崩溃呢,这主要是因为在进程中,各个线程地址空间是共享,既然是共享,那么某个线程对地址非法访问就会导致内存不确定性,进而可能会影响到其他线程,这种操作是危险...(假设为 11,即 SIGSEGV,一般非法访问内存报都是这个错误) 操作系统根据情况执行相应信号处理程序(函数),一般执行完信号处理程序逻辑后会让进程退出 注意上面的第五步,如果进程没有注册自己信号处理函数...都属于非法访问内存, JVM 为什么不会崩溃呢,有了上一节铺垫,相信你不难回答,其实就是因为 JVM 自定义了自己信号处理函数,拦截了 SIGSEGV 信号,针对这两者不让它们崩溃,怎么证明这个推测呢...)我们可以知道以下信息 发生 stackoverflow 还有空指针错误,确实都发送了 SIGSEGV,只是虚拟机选择退出,而是自己内部作了额外处理,其实是恢复了线程执行,并抛出 StackoverflowError

    2.1K20

    番外特别篇之 为什么建议你直接使用UIImage传值?--从一个诡异相册九图连读崩溃bug谈起

    关于"番外特别篇" 所谓"番外特别篇",就是系列文章更新期间内,随机插入一篇文章.目前我正在更新系列文章是 实现iOS图片等资源文件热更新化.但是,这两天,被一个自己App中诡异相册读取Bug...Bug 详细描述 诡异画风 ?...形势,瞬间变得很紧张,这个问题优先级瞬间被提到了最高!再次尝试了各种可能情况.图片大小?它是9张1.5M图,我就用9张3M图,也是OK呀!选取时,顺序有问题?...,而图片本身大小只有 1.5M/张.此处我想说是,打断点也是有技巧,最后没有办法办法也是讲究办法.可是试着注释掉可能引起代码,然后逐步放开注释,这要观察,会比直接打断点快些....resultHandler: 替换 requestImageForAsset:targetSize:contentMode:options:resultHandler: 就可以了,前者是直接返回二进制数据,渲染

    1.7K70

    如何全面监控 iOS 千奇百怪崩溃

    前言 ---- App 上线后,我们最怕出现情况就是应用崩溃了。但是,我们线下测试好好 App,为什么上线后就发生崩溃了呢? 2....这时,崩溃问题对应异常编码是 0x8badf00d ▐ 2.5 野指针 指针指向一个已删除对象访问内存区域时,会出现野指针崩溃指针问题是我们需要重点关注,因为它是导致 App 崩溃最常见,...崩溃信息收集 ---- 注意:程序崩溃了,你 App 就不可用了,对用户伤害也是最大。...▐ 5.1 为什么要实现持久化存储 注意:这是因为,在保存完这些堆栈信息以后,App 就崩溃了,崩溃后内存里数据也就都没有了。...如果 yourTask在3分钟之内没有执行完的话,系统会强制杀掉进程,从而造成崩溃,这就是为什么 App 退后台容易出现崩溃原因。 后台崩溃造成影响是未知

    2.1K20

    小白必看:Python中json.load()和json.loads()方法有什么区别?傻傻分不清。

    目录 1.从代码层面说,程序为什么崩溃 1)读取未赋值变量 2)函数栈溢出 3)数组访问越界 4)指针目标对象不可用 5)参数错误 6)ClassNotFoundException异常 7)未捕获异常...1.从代码层面说,程序为什么崩溃?...3)数组访问越界 4)指针目标对象不可用 指针所指向对象要正常使用,它就必须是一个合法、有效,可以访问对象,像当指针为空指针或野指针时,你再使用它,程序就会立马崩溃。...而出现空指针或者野指针,一般都是下面几种操作导致: 1.指针未赋值 2.free/delete释放了该对象 3.恰当指针强制类型转换 5)参数错误 一般为了保证参数合法,都会设置断言来保证只有参数合法情况下...3.纯粹代码或者依赖管理问题。 补充: 首先,Java错误在程序角度分为exception和error。 error:是代码错误,编译不通过,运行起来。

    2K30
    领券