如何检测指针是否被删除并安全删除?

ahm*_*n86 24 c++ pointers memory-management

C++中如何决定或知道指针是否被删除?

当我试图删除以前在代码的另一部分中删除的指针时,它抛出了无法处理的异常.

我想知道是否有办法检查或尝试删除指针?有关高级内存操作的任何参考.

我也想掌握指针的未处理异常,并且对受保护或访问的访问是违规的,......这种错误.

感谢那些提供一些知识和时间来帮助其他人并分享他们的好处的人


更新

许多现代c ++开发人员社区的重要建议是 - 使用智能指针或尝试避免使用原始指针.但是对于抛出安全性和保证内存不足(ISO_CPP_FAQ),当然如果你想避免使用智能指针的小开销[可能总是不明显但是它们有开销]你可以编写处理原始指针的自定义方法[ type*] - 这不是一般的. 首选智能指针指向原始指针.

在"Going Native 2013"​​中,给出了一个常见的建议 - 从不使用原始指针.

Alo*_*ave 27

可以有三种解决方案.您可能希望根据您想要实现的努力/质量比选择一个:

优雅,最正确的解决方案:

使用智能指针,您不必delete再次手动调用.这是克服此问题的最佳方法.它利用了RAII的原理,它非常适用于像C++这样没有内置垃圾收集器的语言.

不太优雅但可行的解决方案:

NULL删除后指定指针.调用delete一个NULL指针是一个空操作,因此就不再需要有额外的NULL检查,但是这可能会掩盖一些问题,而不是使他们看到的.

不太优雅但更正确的解决方案:

delete通过让程序崩溃来解决所有多个问题.您也可以使用像valgrind这样的内存分析器程序,然后修复代码以避免所有这些问题.

  • 你提出的解决方案都不是一般的.智能指针只能在特殊情况下工作.将删除的指针设置为null并没有太大帮助,因为它不会影响其他指针,并且在事实非常非常困难之后追捕问题.唯一真正的解决方案是预先设计,以便确定(极少数)动态分配对象的生命周期. (6认同)
  • @JamesKanze:一个设计良好的应用程序很少会遇到这样的问题,而且应该始终设计为严格确定和限制对象的生命周期.事实上另一个真实的事实是另一个痛苦的事实是,正确设计的应用程序只存在于理想的世界中,而我们大多数人必须使用已经存在这些问题的应用程序.您不创建它们而是继承它们. (3认同)

Ben*_*tto 5

这是一个很好的问题,但是在手动内存托管环境(例如C / C ++及其表亲)中工作的基本真理之一是,没有一种好的方法可以在事后查看指针并询问其是否有效-一旦失效,它就消失了,看着它很容易爆炸。您的工作是确保它不会被删除或释放超过一次,并且在此之后再也不会被访问。

绝对要看一下智能指针,这些指针是为了在这种情况下简化程序员的生活而发明的。(更传统的方法是要小心,不要弄乱它,然后,当您知道指针已被删除时,可以将NULL分配给指针,如Alok所说。)