【发布时间】:2021-12-16 03:25:55
【问题描述】:
为了防止崩溃,我总是使用 Windows API VirtualQuery 检查指针是否有效;特别是,检查标志PAGE_NOACCESS 以验证指针没有指向错误的内存分配。如果指针是好的,那么我继续使用它。
我可以使用异常处理来获得相同的结果吗?我想使用try 块中的指针读取/写入,然后使用catch 可能的异常来防止崩溃。这是一种不好的做法,甚至可能吗?
【问题讨论】:
-
尝试故意进行错误访问并亲自查看。我希望您看到的是崩溃不会生成 C++ 异常。
-
感谢您的回复 dratenik。该软件无论如何都会随着处理而崩溃。我认为我应该继续使用 VirtualQuary。你认为 VirtualQuary 是不是有点矫枉过正?
-
最好的解决方案是找到任何产生错误指针的错误并修复它。如果由于某种原因您无法做到这一点(通过使用您无法控制的 3rd 方二进制文件来固定错误),那么 VirtualQuery 可能是一个好主意。
-
反对使用 VirtualQuery 的理由是,如果你把检查放在任何地方,你的代码就会变得一团糟。相反,现代 C++ 方法倾向于尽可能避免使用指针,并提供地址清理器等工具来帮助查找错误。
-
谢谢。我刚刚发现了一个小技巧。我可以尝试检查指针是否在程序使用的内存范围内,而不是 VirtualQuery。如果我正在工作的模块从0x0AAA分配到0x0FFF,并且指针试图指向这个范围之外,那么它可能是无效的。
标签: c++ windows pointers exception