【发布时间】:2010-11-02 20:39:20
【问题描述】:
我很清楚这个问题的丑陋,我仍然想知道是否可以:
当程序尝试读取/写入无效指针(NULL、未分配块等)时,Windows 会因访问冲突异常而导致应用程序崩溃。
问题是,有没有办法在尝试使用它之前检查这个指针是否会产生异常,或者,有没有办法捕获这个异常?
【问题讨论】:
我很清楚这个问题的丑陋,我仍然想知道是否可以:
当程序尝试读取/写入无效指针(NULL、未分配块等)时,Windows 会因访问冲突异常而导致应用程序崩溃。
问题是,有没有办法在尝试使用它之前检查这个指针是否会产生异常,或者,有没有办法捕获这个异常?
【问题讨论】:
如果必须使用原始指针,最好的办法是确保它是有效指针或 NULL。然后你可以通过检查它是否等于NULL来检查它是否有效。
但要回答您的问题,您可以通过structured exception handling (SEH) 了解这些内容。
话虽如此,SEH is a bad idea。
【讨论】:
int *n = (int*)malloc(_SIZE_*sizeof(int)); 这样的指针,然后我检查它的 NULL 是否打印一条消息说它的 NULL 但它不会打印,即使我删除了 malloc 函数并且我只是把像int *n; 这样的指针仍然说它不为空。那么在使用 malloc 函数之前我必须初始化为 NULL 吗?
发现此类错误只是解决症状,而不是根本原因。
以下成语适用于任何平台:
将所有指针初始化为零
如果你不能保证一个指针是有效的,在间接它之前检查它是否为非0
删除对象时,删除后指针置0
将指针传递给其他函数时要小心对象所有权问题
【讨论】:
IsBadReadPtr 和 IsBadWritePtr 函数可以满足您的需求。还有an article 解释了为什么你不应该使用它们。
【讨论】:
你当然可以测试指针是否为NULL!
if ( ptr == NULL ) {
// don't use it
}
这是您唯一可以进行的便携式测试。 Windows 确实提供了各种 API 来测试指针,但正如其他人指出的那样,使用它们可能会出现问题。
【讨论】:
【讨论】:
【讨论】:
我不了解 Windows,但在 *nix 中您可以安装 SIGSEGV 信号处理程序来拦截异常。
【讨论】: