C++中为什么不要解引用无效指针


本篇内容主要讲解“C++中为什么不要解引用无效指针”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++中为什么不要解引用无效指针”吧!ES.65:不要解引用无效指针解引用例如null等无效指针,是无定义的行为,通常会立即导致程序崩溃,错误的结果,或者内存破坏。
Note(注意)本规则显而易见而且众所周知,但却很难遵守。它会带来好的代码风格,更充分的库支持,不需要很大代价但可以排除违反的静态解析。这是关于C++类型和资源安全模型的论述的重要组成部分。
See also:(参见)UseRAIIto avoid lifetime problems.使用RAII避免生命周期问题。Useunique_ptrto avoid lifetime problems.使用unique_ptr避免生命周期问题Useshared_ptrto avoid lifetime problems.使用shared_ptr避免生命周期问题Usereferenceswhennullptrisn’t a possibility.如果不可能出现空指针,使用引用Usenot_nullto catch unexpectednullptrearly.使用not_null尽早捕获意外的空指针。Use thebounds profileto avoid range errors.使用边界规则群组避免范围错误。
Example(示例)为了解决这个问题,要么扩展对象指针意图指向的对象的生命周期,要么缩短指针的生命周期(将解引用操作移到 香港云主机所指向对象的生命周期结束之前。)
Unfortunately, most invalid pointer problems are harder to spot and harder to fix.不幸的是,大多数无效指针问题难于发现,也难于修改。Example(示例)这样的代码大量存在。在经历了大量测试之后,大部分情况下可以动作,但是如果只看局部很难判断一个指针有没有可能为空。因此,空指针也是错误的主要来源之一。存在很多方法可以处理这个潜在问题:There are two potential problems with testing fornullptr:检查指针是否为空会有两个潜在问题:
it is not always obvious what to do what to do if we findnullptr在发现了空指针时应该做什么并不总是很明确。
the test can be redundant and/or relatively expensive检查可能是多余的而且/或者代价相当高。
it is not obvious if the test is to protect against a violation or part of the required logic.很难判断这个检查只是为了防止违反还是必要逻辑的一部分。
这种做法只在断言检查有效时需要付出一定的代价,同时可以为编译器/解析器提供有用信息。如果C++得到协议(contracts)的直接支持的话,效果会更好:
Alternatively, we could usegsl::not_nullto ensure thatpis not thenullptr.另外,我们可以使用gsl::not_null来保证p不是空指针。
These remedies take care ofnullptronly. Remember that there are other ways of getting an invalid pointer.这个改进只处理空指针。别忘了还有其他形式的无效指针。Example(示例)This rule is part of thelifetime safety profile本规则是生命周期规则群组的一部分
Flag a dereference of a pointer that points to an object that has gone out of scope如果指针指向的对象已经处于生命周期之外,标记它的解引用操作。
Flag a dereference of a pointer that may have been invalidated by assigning anullptr如果指针由于被设为空指针而无效时,标记它的解引用操作。
Flag a dereference of a pointer that may have been invalidated by adelete如果由于指针指向的对象被销毁而无效时,标记它的解引用操作。
Flag a dereference to a pointer to a container element that may have been invalidated by dereference如果指针指向的容器元素由于解引用而无效时,标记它的解引用操作。到此,相信大家对“C++中为什么不要解引用无效指针”有了更深的了解,不妨来实际操作一番吧!这里是开发云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

相关推荐: Giraph源码分析(八)—— 统计每个SuperStep中参与计算的顶点数目

作者|白松目的:科研中,需要分析在每次迭代过程中参与计算的顶点数目,来进一步优化系统。比如,在SSSP的compute()方法最后一行,都会把当前顶点voteToHalt,即变为InActive状态。所以每次迭代完成后,所有顶点都是InActive状态。在大同…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 08/30 10:00
下一篇 08/30 10:00

相关推荐