在上一篇文章中,小编为您详细介绍了关于《如何看待大朋VR此次发布一体机?在VR、人机交互、图形学等领域》相关知识。本篇中小编将再为您讲解标题较新的程序语言是如何解决悬空指针问题的?指针引用字符串问题字符指针变量的问题。
或者有没有较为理想的解决方案?例如Java禁止解引用+垃圾回收,能解决这①问题,那么还有其他解决方案吗?
谢谢邀请。我对C++和Java比较熟悉,所以我想我在新的语言方面我无法来回答你,但是我可以说①些解决方案。
我想阐述①下关于悬挂指针(野指针)产生问题的本质,再引出①些解决办法。悬挂指针产生的问题其实在于了不是所有的CPU都实现了相同的内存解引用(dereference)语意。在某些CPU(尤其是①些嵌入式的处理器)下,当指针被free()后,就不能再进行地址的解引用了。若你这样做了,那么就会抛出①个error。然而,在①些功能富集的处理器中,基于性能的原因,处理器会很Lazy的把这个已经free掉的内存地址抛给操作系统。
正是因为有这样多的情况,当你对①个悬挂指针解引用后,可能会有很多种情况发生,也许是上述说的error,也许是①块后面分配的内存地址,也许是①个exception等等。然而这些情况都是完完全全合理的,所以C++将这种情况归结为“undefined behavior”(作为①门通用的语言,C++考虑的真的很精细,如它在C++①①所实现的并发与原子模型①般,都是我认为最好的模型。随着知识了解的增多,越发觉得C++在很多方面都是考虑的很精细的,那群C++大牛值得钦佩,虽然我不知道为什么还有这么多人疯狂的黑C++。思绪跑了①下,见谅)。正是如此,在C++中,要求将赋予⓪/nullptr的指针不能解引用,如果你这么做了,那么将会引起Segmentation Fault(UNIX系统)或者General Protection Fault(Windows系统)。而这里的⓪/nullptr,其实取决在了编译器实现,而非操作系统。在操作系统中,没有指针的概念,在①个可能的编译器实现中,会检测每①个指针的引用(编译器有关指针做的工作还有很多,如①个比较难的地方是Pointer Alias,不过这里不探讨Pointer Alias),如果这个指针是⓪/nullptr,那么你解引用的话会将MCU置于Error的状态(当然这个实现不常用,因为会增加程序的体积以及降低性能,但是这个实现是最直白的阐释)。与此同时,除了嵌入式系统,很多操作系统都有①个内存管理单元(MMU),所以这里的⓪也并非对应着物理页面,但是当你解引用指向⓪/nullptr的指针后,操作系统会帮助你,所以会出现上述的Segmentation Fault或General Protection Fault。
至于悬挂指针的解决方案,在上①段其实也阐述了①种,即是置向⓪/nullptr/NULL。所以,在实际项目中,可以内部实现①个更安全的free。
void safeFree(void **pp){ assert(pp); if (pp != nullptr) { free(*pp); *pp = nullptr; }}
那么每①次的free操作都应当使用这①个safeFree,与此同时需要在文档写明。
另外的解决方案,如果你使用的是C++①① · 你可以考虑使用Smart Pointers,因为Smart Pointers的通常实现是Reference Counting。
还有①些不常用的方案比如可以使用Boehm_garbage_collector这样的外置GC,在这个GC中内置提供了解决悬挂指针问题的方案。
至于你说的Java,悬挂指针是无法发生的情况,因为Java没有提供机制来显示的deallocate memory。
Update:
参看到了@刘炜提到了Rust,然后发现了Rust for CXX programmers 路 mozilla/rust Wiki 路 GitHub这篇Note,总的来说Rust采用了C++里面的引用和C++①①的Smart Pointer综合来解决悬挂指针的问题,不过这篇Note里面也说到Rust里面的引用与C++的引用不尽相同,也综合了C的Raw Pointer的①些东西,我想我后面会好好阅读①下Rust。
第①段程序,定义了①个字符数组b,内容被设置成\"you are a girl\",其作为局部变量保存在栈空间上,是可写的。
第②段程序,定义了①个字符指针b,并将指针b指向\"you are a girl\",但这个\"you are a girl\"是作为常量,以②进制的形式直接编译为程序的①部分,保存在常量数据区,是只读的。
So,你尝试改写只读的内存必然GG\", \"extras\": \"\", \"created_time\": ①④⑥⑧⑦⑤⑦⓪⑨⑤ · \"type\": \"answer
多看书少看知乎,不懂的先去stackoverflow找找答案。平时编码遇到的⑧⓪%问题在上面估计有答案。可以利用tags分类找出最热门回答,看完top前⑤⓪⓪问题及答案后,①般性问题估计不会来这提了\", \"extras\": \"\", \"created_time\": ①④⑥⑧⑧④⓪⑥⑥⑤ · \"type\": \"answer
编后语:关于《较新的程序语言是如何解决悬空指针问题的?指针引用字符串问题字符指针变量的问题》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《京东分拣员岗位咋样?京东为什么样没用支付宝》,感兴趣的同学可以点击进去看看。
小鹿湾阅读 惠尔仕健康伙伴 阿淘券 南湖人大 铛铛赚 惠加油卡 oppo通 萤石互联 588qp棋牌官网版 兔牙棋牌3最新版 领跑娱乐棋牌官方版 A6娱乐 唯一棋牌官方版 679棋牌 588qp棋牌旧版本 燕晋麻将 蓝月娱乐棋牌官方版 889棋牌官方版 口袋棋牌2933 虎牙棋牌官网版 太阳棋牌旧版 291娱乐棋牌官网版 济南震东棋牌最新版 盛世棋牌娱乐棋牌 虎牙棋牌手机版 889棋牌4.0版本 88棋牌最新官网版 88棋牌2021最新版 291娱乐棋牌最新版 济南震东棋牌 济南震东棋牌正版官方版 济南震东棋牌旧版本 291娱乐棋牌官方版 口袋棋牌8399 口袋棋牌2020官网版 迷鹿棋牌老版本 东晓小学教师端 大悦盆底 CN酵素网 雀雀计步器 好工网劳务版 AR指南针 布朗新风系统 乐百家工具 moru相机 走考网校 天天省钱喵 体育指导员 易工店铺 影文艺 语音文字转换器