【发布时间】:2012-04-18 22:10:11
【问题描述】:
考虑以下几点:
int * i = malloc(sizeof(int));
free(i);
我现在处于i 指向已释放内存的场景中,但它也非零;这是 C 编程中的一个常见错误,有没有办法在我去做类似的事情之前告诉 i 仍然是一个有效的指针:
*i++; //probable EXC_BAD_ACCESS crash
我知道完全不可能有 100% 可靠(无误报)的方法,除非您从未重用内存;但是大部分时间都有效的东西对于调试来说非常有用。
编辑
我并不是说您不应该将指针设置为 NULL,我只是想知道是否有一种可移植(POSIXish)的方式来戳地址而不会造成灾难性影响,我只是对调试复杂的多线程问题感兴趣不时出现。
【问题讨论】:
-
始终在
free之后将i设置为NULL,并在取消引用之前测试它是否为NULL。 -
简单回答:不。复杂的答案:不。
-
@Anthales 只要你只有一个对指针的引用就可以工作,我注意到这是一个编程错误。
-
这可能是真的,但是如果您有多个指向同一个对象的指针,则无论如何您都需要考虑所有指针。所以在这种情况下,理查兹的评论适用。
-
FWIW,我不同意这种“总是将事物设置为空”的废话。当指针超出范围,或者当它所属的结构被释放时释放指针。然后,是否将其设置为 null 并不重要,因为您已经设计了代码,因此无论如何您都不会再次使用它。比围绕可能为空或不为空的指针更安全,因为它们的用户必须一直检查。例外情况是在执行诸如清除缓存而不销毁缓存之类的操作时——然后您想释放它,并将其设置为 null 以表示不再存在任何内容。
标签: c debugging pointers exception-handling