较新的程序语言是如何解决悬空指针问题的?指针引用字符串问题字符指针变量的问题

时间:2017-12-19 18:20:02   浏览:次   点击:次   作者:   来源:   立即下载

或者有没有较为理想的解决方案?例如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

收起

相关推荐

相关应用

平均评分 0人
  • 5星
  • 4星
  • 3星
  • 2星
  • 1星
用户评分:
发表评论

评论

  • 暂无评论信息