我正在使用一个 MFC 项目,该项目应在独立于平台的环境中进行保护,使用标准函数而不是 MFC/AFX。
例如:将使用 std::string 代替 CString,使用 std::mutex 代替 CMutex。
MFC 函数“AfxIsValidAddress”的独立于平台的 C++11 std::-等价物是什么?
我正在使用一个 MFC 项目,该项目应在独立于平台的环境中进行保护,使用标准函数而不是 MFC/AFX。
例如:将使用 std::string 代替 CString,使用 std::mutex 代替 CMutex。
MFC 函数“AfxIsValidAddress”的独立于平台的 C++11 std::-等价物是什么?
标准库中没有类似的东西AfxIsValidAddress()
,而且似乎该函数实际上并没有做那么多验证。
请参阅AfxIsValidAddress (and Others) Don't Work as Advertised,它说该函数最终只是对 NULL 进行检查。关于有效地址检查功能系列,它也有这样的说法:
有几个功能相似的 Win32 API:
IsBadWritePtr
、IsBadHugeWritePtr
、IsBadReadPtr
、IsBadHugeReadPtr
、IsBadCodePtr
、IsBadStringPtr
。至少从 2004 年开始,人们就知道这些功能已经无法修复,永远不能使用。万能的 Raymond Chen 和 Larry Osterman 都详细讨论了原因,所以只是简短的重新hash:IsBad*Ptr 都是通过访问测试地址并捕获任何抛出的异常来工作的。问题是这些访问违规中的某些(即堆栈保护页面上的)永远不应该被捕获 - 操作系统使用它们来适当地扩大线程堆栈。
我认为最好遵循标准的 C++ 程序来检查指针是否不是nullptr
或更好地尽可能限制指针的使用。